home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / ld / dist / ld.diff < prev    next >
Encoding:
Text File  |  1990-10-26  |  150.5 KB  |  5,409 lines

  1. *** /tmp/jhh/binutils/ld.c    Thu Jun 21 14:52:49 1990
  2. --- ld.original    Thu Oct 25 22:09:56 1990
  3. ***************
  4. *** 23,60 ****
  5.   #include <sys/types.h>
  6.   #include <sys/stat.h>
  7.   #include <sys/file.h>
  8. - #ifndef USG
  9. - #include <sys/time.h>
  10. - #include <sys/resource.h>
  11. - #endif
  12.   #ifndef sony_news
  13.   #include <fcntl.h>
  14.   #endif
  15.   
  16. - #if !defined(A_OUT) && !defined(MACH_O)
  17. - #define A_OUT
  18. - #endif
  19. - #ifdef A_OUT
  20.   #ifdef COFF_ENCAPSULATE
  21.   #include "a.out.encap.h"
  22.   #else
  23.   #include <a.out.h>
  24.   #endif
  25. - #endif
  26. - #ifdef MACH_O
  27. - #ifndef A_OUT
  28. - #include <nlist.h>
  29. - #include <reloc.h>
  30. - #endif
  31. - #ifndef N_TEXT
  32. - #define N_TEXT 0x04
  33. - #define N_DATA 0x06
  34. - #define N_BSS 0x08
  35. - #endif
  36. - #include <sys/loader.h>
  37. - #endif
  38.   
  39.   #ifndef N_SET_MAGIC
  40.   #define N_SET_MAGIC(exec, val)  ((exec).a_magic = val)
  41. --- 23,37 ----
  42. ***************
  43. *** 62,78 ****
  44.   
  45.   /* If compiled with GNU C, use the built-in alloca */
  46.   #ifdef __GNUC__
  47. ! # define alloca __builtin_alloca
  48. ! #else
  49. ! # if defined(sun) && defined(sparc)
  50. ! #  include "alloca.h"
  51. ! # else
  52. ! char *alloca ();
  53. ! # endif
  54.   #endif
  55.   
  56. - #include "getopt.h"
  57.   /* Always use the GNU version of debugging symbol type codes, if possible.  */
  58.   
  59.   #include "stab.h"
  60. --- 39,47 ----
  61.   
  62.   /* If compiled with GNU C, use the built-in alloca */
  63.   #ifdef __GNUC__
  64. ! #define alloca __builtin_alloca
  65.   #endif
  66.   
  67.   /* Always use the GNU version of debugging symbol type codes, if possible.  */
  68.   
  69.   #include "stab.h"
  70. ***************
  71. *** 117,129 ****
  72.   /* Define this to specify the default executable format.  */
  73.   
  74.   #ifdef hpux
  75. ! #define DEFAULT_OUTPUT_STYLE OUTPUT_READONLY_TEXT
  76.   #endif
  77.   
  78.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  79.   
  80.   #ifndef N_TXTADDR
  81. ! #if defined(vax) || defined(sony_news) || defined(hp300) || defined(pyr)
  82.   #define N_TXTADDR(X) 0
  83.   #endif
  84.   #ifdef is68k
  85. --- 86,102 ----
  86.   /* Define this to specify the default executable format.  */
  87.   
  88.   #ifdef hpux
  89. ! #define DEFAULT_MAGIC NMAGIC  /* hpux bugs screw ZMAGIC */
  90.   #endif
  91.   
  92. + #ifndef DEFAULT_MAGIC
  93. + #define DEFAULT_MAGIC ZMAGIC
  94. + #endif
  95.   /* Ordinary 4.3bsd lacks these macros in a.out.h.  */
  96.   
  97.   #ifndef N_TXTADDR
  98. ! #if defined(vax) || defined(sony_news)
  99.   #define N_TXTADDR(X) 0
  100.   #endif
  101.   #ifdef is68k
  102. ***************
  103. *** 132,144 ****
  104.   #ifdef sequent
  105.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  106.   #endif
  107. - #ifdef NeXT
  108. - #define N_TXTADDR(X) ((X).a_magic == ZMAGIC ? page_size : 0)
  109. - #endif
  110.   #endif
  111.   
  112.   #ifndef N_DATADDR
  113. ! #if defined(vax) || defined(sony_news) || defined(hp300) || defined(pyr)
  114.   #define N_DATADDR(x) \
  115.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  116.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  117. --- 105,114 ----
  118.   #ifdef sequent
  119.   #define    N_TXTADDR(x) (N_ADDRADJ(x))
  120.   #endif
  121.   #endif
  122.   
  123.   #ifndef N_DATADDR
  124. ! #if defined(vax) || defined(sony_news)
  125.   #define N_DATADDR(x) \
  126.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  127.       : (page_size+((N_TXTADDR(x)+(x).a_text-1) & ~(page_size-1))))
  128. ***************
  129. *** 154,172 ****
  130.       (((x).a_magic==OMAGIC)? (N_TXTADDR(x)+(x).a_text) \
  131.       : (page_size+(((x).a_text-1) & ~(page_size-1))))
  132.   #endif
  133. - #ifdef NeXT
  134. - #define N_DATADDR(X) \
  135. -     (((X).a_magic==ZMAGIC)?(N_TXTADDR(X)+(X).a_text+0xFFFF)&~0xFFFF \
  136. -      :N_TXTADDR(X)+(X).a_text)
  137.   #endif
  138. - #endif
  139. - /* The "address" of the data segment in a relocatable file.
  140. -    The text address of a relocatable file is always
  141. -    considered to be zero (instead of the value of N_TXTADDR, which
  142. -    is what the address is in an executable), so we need to subtract
  143. -    N_TXTADDR from N_DATADDR to get the "address" for the input file.  */
  144. - #define DATA_ADDR_DOT_O(hdr) (N_DATADDR(hdr) - N_TXTADDR(hdr))
  145.   
  146.   /* Define how to initialize system-dependent header fields.  */
  147.   #ifdef sun
  148. --- 124,130 ----
  149. ***************
  150. *** 173,195 ****
  151.   #ifdef sparc
  152.   #define INITIALIZE_HEADER \
  153.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  154. ! #endif /* sparc.  */
  155. ! #if defined(mc68000)
  156. ! /* Set the machine type according to the machine type of the .o files.
  157. !    If they are all sun2 (68010), then the type of the executable is sun2.
  158. !    If any is sun3 (68020), then the type of the executable is sun3.
  159. !    This is consistent with the Sun loader and more useful than having
  160. !    it depend on which machine you are on when you run ld.  */
  161. ! static int sun_machtype = M_68010;
  162. ! #define INITIALIZE_HEADER outheader.a_machtype = sun_machtype
  163. ! #define READ_HEADER_HOOK(machtype) \
  164. !   if (machtype == M_68020)           \
  165. !     {                     \
  166. !       sun_machtype = M_68020;         \
  167. !     }
  168. ! #endif /* mc68000.  */
  169. ! #endif /* Sun.  */
  170.   #ifdef ALTOS
  171.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  172.   #endif
  173. --- 131,144 ----
  174.   #ifdef sparc
  175.   #define INITIALIZE_HEADER \
  176.     {outheader.a_machtype = M_SPARC; outheader.a_toolversion = 1;}
  177. ! #endif
  178. ! #if defined(mc68010) || defined(m68010)
  179. ! #define INITIALIZE_HEADER outheader.a_machtype = M_68010
  180. ! #endif
  181. ! #ifndef INITIALIZE_HEADER
  182. ! #define INITIALIZE_HEADER outheader.a_machtype = M_68020
  183. ! #endif
  184. ! #endif
  185.   #ifdef ALTOS
  186.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_68020)
  187.   #endif
  188. ***************
  189. *** 206,218 ****
  190.   #endif
  191.   #if defined(i386) && !defined(sequent)
  192.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  193. ! #endif /* Sequent symmetry.  */
  194. ! #if defined(hp300)
  195. ! #define INITIALIZE_HEADER outheader.a_mid = MID_HP300
  196. ! #endif /* hp300.  */
  197. ! #ifdef pyr
  198. ! #define INITIALIZE_HEADER outheader.a_machid = PYR90X
  199. ! #endif /* Pyramid.  */
  200.   
  201.   #ifdef is68k
  202.   /* This enables code to take care of an ugly hack in the ISI OS.
  203. --- 155,161 ----
  204.   #endif
  205.   #if defined(i386) && !defined(sequent)
  206.   #define INITIALIZE_HEADER N_SET_MACHTYPE (outheader, M_386)
  207. ! #endif
  208.   
  209.   #ifdef is68k
  210.   /* This enables code to take care of an ugly hack in the ISI OS.
  211. ***************
  212. *** 221,234 ****
  213.   #define DOLLAR_KLUDGE
  214.   #endif
  215.   
  216. ! /* Values for 3rd argument to lseek().  */
  217.   #ifndef L_SET
  218.   #define L_SET 0
  219.   #endif
  220. - /* This is called L_INCR in BSD, but SEEK_CUR in POSIX.  */
  221. - #ifndef SEEK_CUR
  222. - #define SEEK_CUR 1
  223. - #endif
  224.   
  225.   /*
  226.    * Ok.  Following are the relocation information macros.  If your
  227. --- 164,179 ----
  228.   #define DOLLAR_KLUDGE
  229.   #endif
  230.   
  231. ! /*
  232. !  * Alloca include.
  233. !  */
  234. ! #if defined(sun) && defined(sparc) && !defined(__GNUC__)
  235. ! #include "alloca.h"
  236. ! #endif
  237.   #ifndef L_SET
  238.   #define L_SET 0
  239.   #endif
  240.   
  241.   /*
  242.    * Ok.  Following are the relocation information macros.  If your
  243. ***************
  244. *** 248,254 ****
  245.    * what the value of the relocation actually was.  *Must be an lvalue*.
  246.    *
  247.    *   RELOC_TYPE (rval): For a non-external relocation, this is the
  248. !  * segment to relocate for.  *Must be an lvalue.*
  249.    *
  250.    *   RELOC_SYMBOL (rval): For an external relocation, this is the
  251.    * index of its symbol in the symbol table.  *Must be an lvalue*.
  252. --- 193,199 ----
  253.    * what the value of the relocation actually was.  *Must be an lvalue*.
  254.    *
  255.    *   RELOC_TYPE (rval): For a non-external relocation, this is the
  256. !  * segment to relocate for.
  257.    *
  258.    *   RELOC_SYMBOL (rval): For an external relocation, this is the
  259.    * index of its symbol in the symbol table.  *Must be an lvalue*.
  260. ***************
  261. *** 312,324 ****
  262.   /* Sparc (Sun 4) macros */
  263.   #undef relocation_info
  264.   #define relocation_info                    reloc_info_sparc
  265. ! #define RELOC_ADDRESS(r)        ((r)->r_address)
  266. ! #define RELOC_EXTERN_P(r)               ((r)->r_extern)
  267. ! #define RELOC_TYPE(r)                   ((r)->r_index)
  268. ! #define RELOC_SYMBOL(r)                 ((r)->r_index)
  269.   #define RELOC_MEMORY_SUB_P(r)        0
  270.   #define RELOC_MEMORY_ADD_P(r)           0
  271. ! #define RELOC_ADD_EXTRA(r)              ((r)->r_addend)
  272.   #define RELOC_PCREL_P(r)             \
  273.           ((r)->r_type >= RELOC_DISP8 && (r)->r_type <= RELOC_WDISP22)
  274.   #define RELOC_VALUE_RIGHTSHIFT(r)       (reloc_target_rightshift[(r)->r_type])
  275. --- 257,269 ----
  276.   /* Sparc (Sun 4) macros */
  277.   #undef relocation_info
  278.   #define relocation_info                    reloc_info_sparc
  279. ! #define RELOC_ADDRESS(r)        ((r)->r_address)                 
  280. ! #define RELOC_EXTERN_P(r)               ((r)->r_extern)      
  281. ! #define RELOC_TYPE(r)                   ((r)->r_index)  
  282. ! #define RELOC_SYMBOL(r)                 ((r)->r_index)   
  283.   #define RELOC_MEMORY_SUB_P(r)        0
  284.   #define RELOC_MEMORY_ADD_P(r)           0
  285. ! #define RELOC_ADD_EXTRA(r)              ((r)->r_addend)       
  286.   #define RELOC_PCREL_P(r)             \
  287.           ((r)->r_type >= RELOC_DISP8 && (r)->r_type <= RELOC_WDISP22)
  288.   #define RELOC_VALUE_RIGHTSHIFT(r)       (reloc_target_rightshift[(r)->r_type])
  289. ***************
  290. *** 399,405 ****
  291.      So, for example, the following two lines placed in an assembler
  292.      input file would result in an object file which would direct gnu ld
  293.      to resolve all references to symbol "foo" as references to symbol
  294. !    "bar".
  295.   
  296.       .stabs "_foo",11,0,0,0
  297.       .stabs "_bar",1,0,0,0
  298. --- 344,350 ----
  299.      So, for example, the following two lines placed in an assembler
  300.      input file would result in an object file which would direct gnu ld
  301.      to resolve all references to symbol "foo" as references to symbol
  302. !    "bar". 
  303.   
  304.       .stabs "_foo",11,0,0,0
  305.       .stabs "_bar",1,0,0,0
  306. ***************
  307. *** 495,501 ****
  308.   
  309.   /* If a this type of symbol is encountered, its name is a warning
  310.      message to print each time the symbol referenced by the next symbol
  311. !    table entry is referenced.
  312.   
  313.      This feature may be used to allow backwards compatibility with
  314.      certain functions (eg. gets) but to discourage programmers from
  315. --- 440,446 ----
  316.   
  317.   /* If a this type of symbol is encountered, its name is a warning
  318.      message to print each time the symbol referenced by the next symbol
  319. !    table entry is referenced.   
  320.   
  321.      This feature may be used to allow backwards compatibility with
  322.      certain functions (eg. gets) but to discourage programmers from
  323. ***************
  324. *** 557,563 ****
  325.         /* Nonzero means definitions of this symbol as common have been seen,
  326.        and the value here is the largest size specified by any of them.  */
  327.         int max_common_size;
  328. !       /* For OUTPUT_RELOCATABLE, records the index of this global sym in the
  329.        symbol table to be written, with the first global sym given index 0.*/
  330.         int def_count;
  331.         /* Nonzero means a definition of this global symbol is known to exist.
  332. --- 502,508 ----
  333.         /* Nonzero means definitions of this symbol as common have been seen,
  334.        and the value here is the largest size specified by any of them.  */
  335.         int max_common_size;
  336. !       /* For relocatable_output, records the index of this global sym in the
  337.        symbol table to be written, with the first global sym given index 0.*/
  338.         int def_count;
  339.         /* Nonzero means a definition of this global symbol is known to exist.
  340. ***************
  341. *** 585,599 ****
  342.       }
  343.     symbol;
  344.   
  345. - /* Demangler for C++.  */
  346. - extern char *cplus_demangle ();
  347. - /* Demangler function to use.  We unconditionally enable the C++ demangler
  348. -    because we assume any name it successfully demangles was probably produced
  349. -    by the C++ compiler.  Enabling it only if -lg++ was specified seems too
  350. -    much of a kludge.  */
  351. - char *(*demangler)() = cplus_demangle;
  352.   /* Number of buckets in symbol hash table */
  353.   #define    TABSIZE    1009
  354.   
  355. --- 530,535 ----
  356. ***************
  357. *** 675,694 ****
  358.      -e sets this.  */
  359.   symbol *entry_symbol;
  360.   
  361. - /* These can be NULL if we don't actually have such a symbol.  */
  362.   symbol *edata_symbol;   /* the symbol _edata */
  363.   symbol *etext_symbol;   /* the symbol _etext */
  364.   symbol *end_symbol;    /* the symbol _end */
  365. - /* We also need __{edata,etext,end} so that they can safely
  366. -    be used from an ANSI library.  */
  367. - symbol *edata_symbol_alt;
  368. - symbol *etext_symbol_alt;
  369. - symbol *end_symbol_alt;
  370.   
  371. - /* Kinds of files potentially understood by the linker. */
  372. - enum file_type { IS_UNKNOWN, IS_ARCHIVE, IS_A_OUT, IS_MACH_O };
  373.   /* Each input file, and each library member ("subfile") being loaded,
  374.      has a `file_entry' structure for it.
  375.   
  376. --- 611,620 ----
  377. ***************
  378. *** 704,771 ****
  379.   struct file_entry {
  380.     /* Name of this file.  */
  381.     char *filename;
  382. -   /* What kind of file this is. */
  383. -   enum file_type file_type;
  384.     /* Name to use for the symbol giving address of text start */
  385.     /* Usually the same as filename, but for a file spec'd with -l
  386.        this is the -l switch itself rather than the filename.  */
  387.     char *local_sym_name;
  388.   
  389. !   /* Describe the layout of the contents of the file.  */
  390.   
  391. !   /* The text section. */
  392. !   unsigned long int orig_text_address;
  393. !   unsigned long int text_size;
  394. !   long int text_offset;
  395. !   /* Text relocation. */
  396. !   unsigned long int text_reloc_size;
  397. !   long int text_reloc_offset;
  398. !   /* The data section. */
  399. !   unsigned long int orig_data_address;
  400. !   unsigned long int data_size;
  401. !   long int data_offset;
  402. !   /* Data relocation. */
  403. !   unsigned long int data_reloc_size;
  404. !   long int data_reloc_offset;
  405. !   /* The bss section. */
  406. !   unsigned long int orig_bss_address;
  407. !   unsigned long int bss_size;
  408. !   /* The symbol and string tables. */
  409. !   unsigned long int syms_size;
  410. !   long int syms_offset;
  411. !   unsigned long int strs_size;
  412. !   long int strs_offset;
  413. !   /* The GDB symbol segment, if any. */
  414. !   unsigned long int symseg_size;
  415. !   long int symseg_offset;
  416. ! #ifdef MACH_O
  417. !   /* Section ordinals from the Mach-O load commands.  These
  418. !      are compared with the n_sect fields of symbols.  */
  419. !   int text_ordinal;
  420. !   int data_ordinal;
  421. !   int bss_ordinal;
  422. ! #endif
  423.   
  424.     /* Describe data from the file loaded into core */
  425.   
  426.     /* Symbol table of the file.  */
  427.     struct nlist *symbols;
  428.     /* Pointer to the string table.
  429.        The string table is not kept in core all the time,
  430.        but when it is in core, its address is here.  */
  431.     char *strings;
  432.   
  433. !   /* Next two used only if OUTPUT_RELOCATABLE or if needed for */
  434.     /* output of undefined reference line numbers. */
  435.   
  436.     /* Text reloc info saved by `write_text' for `coptxtrel'.  */
  437. --- 630,659 ----
  438.   struct file_entry {
  439.     /* Name of this file.  */
  440.     char *filename;
  441.     /* Name to use for the symbol giving address of text start */
  442.     /* Usually the same as filename, but for a file spec'd with -l
  443.        this is the -l switch itself rather than the filename.  */
  444.     char *local_sym_name;
  445.   
  446. !   /* Describe the layout of the contents of the file */
  447.   
  448. !   /* The file's a.out header.  */
  449. !   struct exec header;
  450. !   /* Offset in file of GDB symbol segment, or 0 if there is none.  */
  451. !   int symseg_offset;
  452.   
  453.     /* Describe data from the file loaded into core */
  454.   
  455.     /* Symbol table of the file.  */
  456.     struct nlist *symbols;
  457. !   /* Size in bytes of string table.  */
  458. !   int string_size;
  459.     /* Pointer to the string table.
  460.        The string table is not kept in core all the time,
  461.        but when it is in core, its address is here.  */
  462.     char *strings;
  463.   
  464. !   /* Next two used only if `relocatable_output' or if needed for */
  465.     /* output of undefined reference line numbers. */
  466.   
  467.     /* Text reloc info saved by `write_text' for `coptxtrel'.  */
  468. ***************
  469. *** 836,905 ****
  470.   
  471.   char *output_filename;
  472.   
  473. ! /* What kind of output file to write.  */
  474.   
  475. ! enum file_type output_file_type;
  476.   
  477. ! #ifndef DEFAULT_OUTPUT_FILE_TYPE
  478. ! #ifdef MACH_O
  479. ! #define DEFAULT_OUTPUT_FILE_TYPE IS_MACH_O
  480. ! #else
  481. ! #define DEFAULT_OUTPUT_FILE_TYPE IS_A_OUT
  482. ! #endif
  483. ! #endif
  484. ! /* What `style' of output file to write.  For BSD a.out files
  485. !    this specifies OMAGIC, NMAGIC, or ZMAGIC.  For Mach-O files
  486. !    this switches between MH_OBJECT and two flavors of MH_EXECUTE.  */
  487.   
  488. ! enum output_style
  489. !   {
  490. !     OUTPUT_UNSPECIFIED,
  491. !     OUTPUT_RELOCATABLE,        /* -r */
  492. !     OUTPUT_WRITABLE_TEXT,    /* -N */
  493. !     OUTPUT_READONLY_TEXT,    /* -n */
  494. !     OUTPUT_DEMAND_PAGED        /* -Z (default) */
  495. !   };
  496. ! enum output_style output_style;
  497.   
  498. ! #ifndef DEFAULT_OUTPUT_STYLE
  499. ! #define DEFAULT_OUTPUT_STYLE OUTPUT_DEMAND_PAGED
  500.   #endif
  501.   
  502. - /* Descriptor for writing that file with `mywrite'.  */
  503. - int outdesc;
  504.   /* The following are computed by `digest_symbols'.  */
  505.   
  506. ! int text_size;            /* total size of text of all input files.  */
  507. ! int text_header_size;        /* size of the file header if included in the
  508. !                    text size.  */
  509. ! int data_size;            /* total size of data of all input files.  */
  510. ! int bss_size;            /* total size of bss of all input files.  */
  511. ! int text_reloc_size;        /* total size of text relocation of all input files.  */
  512. ! int data_reloc_size;        /* total size of data relocation of all input
  513. !                    files.  */
  514. !   
  515. ! /* The following are computed by write_header().  */
  516. ! long int output_text_offset;    /* file offset of the text section.  */
  517. ! long int output_data_offset;    /* file offset of the data section.  */
  518. ! long int output_trel_offset;    /* file offset of the text relocation info.  */
  519. ! long int output_drel_offset;    /* file offset of the data relocation info.  */
  520. ! long int output_syms_offset;    /* file offset of the symbol table.  */
  521. ! long int output_strs_offset;    /* file offset of the string table.  */
  522. ! /* The following are incrementally computed by write_syms(); we keep
  523. !    them here so we can examine their values afterwards.  */
  524. ! unsigned int output_syms_size;    /* total bytes of symbol table output. */
  525. ! unsigned int output_strs_size;    /* total bytes of string table output. */
  526. ! /* This can only be computed after the size of the string table is known.  */
  527. ! long int output_symseg_offset;    /* file offset of the symbol segment (if any).  */
  528. ! /* Incrementally computed by write_file_symseg().  */
  529. ! unsigned int output_symseg_size;
  530.   
  531.   /* Specifications of start and length of the area reserved at the end
  532.      of the text segment for the set vectors.  Computed in 'digest_symbols' */
  533. --- 724,750 ----
  534.   
  535.   char *output_filename;
  536.   
  537. ! /* Descriptor for writing that file with `mywrite'.  */
  538.   
  539. ! int outdesc;
  540.   
  541. ! /* Header for that file (filled in by `write_header').  */
  542.   
  543. ! struct exec outheader;
  544.   
  545. ! #ifdef COFF_ENCAPSULATE
  546. ! struct coffheader coffheader;
  547. ! int need_coff_header;
  548.   #endif
  549.   
  550.   /* The following are computed by `digest_symbols'.  */
  551.   
  552. ! int text_size;        /* total size of text of all input files.  */
  553. ! int data_size;        /* total size of data of all input files.  */
  554. ! int bss_size;        /* total size of bss of all input files.  */
  555. ! int text_reloc_size;    /* total size of text relocation of all input files.  */
  556. ! int data_reloc_size;    /* total size of data relocation of all input */
  557. !             /* files.  */
  558.   
  559.   /* Specifications of start and length of the area reserved at the end
  560.      of the text segment for the set vectors.  Computed in 'digest_symbols' */
  561. ***************
  562. *** 910,922 ****
  563.      written. */
  564.   unsigned long *set_vectors;
  565.   
  566. ! /* Amount of cleared space to leave at the end of the text segment.  */
  567.   
  568.   int text_pad;
  569.   
  570. ! /* Amount of padding at end of data segment.  This has two parts:
  571. !    That which is before the bss segment, and that which overlaps
  572. !    with the bss segment.  */
  573.   int data_pad;
  574.   
  575.   /* Format of __.SYMDEF:
  576. --- 755,766 ----
  577.      written. */
  578.   unsigned long *set_vectors;
  579.   
  580. ! /* Amount of cleared space to leave between the text and data segments.  */
  581.   
  582.   int text_pad;
  583.   
  584. ! /* Amount of bss segment to include as part of the data segment.  */
  585.   int data_pad;
  586.   
  587.   /* Format of __.SYMDEF:
  588. ***************
  589. *** 937,945 ****
  590. --- 781,796 ----
  591.      write any padding in the output file for it.  */
  592.   int text_start;
  593.   
  594. + /* Offset of default entry-pc within the text section.  */
  595. + int entry_offset;
  596.   /* Address we decide the data section will be loaded at.  */
  597.   int data_start;
  598.   
  599. + /* `text-start' address is normally this much plus a page boundary.
  600. +    This is not a user option; it is fixed for each system.  */
  601. + int text_start_alignment;
  602.   /* Nonzero if -T was specified in the command line.
  603.      This prevents text_start from being set later to default values.  */
  604.   int T_flag_specified;
  605. ***************
  606. *** 953,958 ****
  607. --- 804,812 ----
  608.      and reduce the size of the bss section to match.  */
  609.   int specified_data_size;
  610.   
  611. + /* Magic number to use for the output file, set by switch.  */
  612. + int magic;
  613.   /* Nonzero means print names of input files as processed.  */
  614.   int trace_files;
  615.   
  616. ***************
  617. *** 968,974 ****
  618.   /* 1 => write load map.  */
  619.   int write_map;
  620.   
  621. ! /* 1 => assign space to common symbols even if OUTPUT_RELOCATABLE. */
  622.   int force_common_definition;
  623.   
  624.   /* Standard directories to search for files specified by -l.  */
  625. --- 822,831 ----
  626.   /* 1 => write load map.  */
  627.   int write_map;
  628.   
  629. ! /* 1 => write relocation into output file so can re-input it later.  */
  630. ! int relocatable_output;
  631. ! /* 1 => assign space to common symbols even if `relocatable_output'.  */
  632.   int force_common_definition;
  633.   
  634.   /* Standard directories to search for files specified by -l.  */
  635. ***************
  636. *** 983,991 ****
  637.   #endif
  638.   #endif
  639.   
  640. - /* If set STANDARD_SEARCH_DIRS is not searched.  */
  641. - int no_standard_dirs;
  642.   /* Actual vector of directories to search;
  643.      this contains those specified with -L plus the standard ones.  */
  644.   char **search_dirs;
  645. --- 840,845 ----
  646. ***************
  647. *** 993,1000 ****
  648.   /* Length of the vector `search_dirs'.  */
  649.   int n_search_dirs;
  650.   
  651. ! /* Non zero means to create the output executable.
  652. !    Cleared by nonfatal errors.  */
  653.   int make_executable;
  654.   
  655.   /* Force the executable to be output, even if there are non-fatal
  656. --- 847,854 ----
  657.   /* Length of the vector `search_dirs'.  */
  658.   int n_search_dirs;
  659.   
  660. ! /* Non zero means to create the output executable. */
  661. ! /* Cleared by nonfatal errors.  */
  662.   int make_executable;
  663.   
  664.   /* Force the executable to be output, even if there are non-fatal
  665. ***************
  666. *** 1007,1021 ****
  667.   struct glosym **cmdline_references;
  668.   int cl_refs_allocated;
  669.   
  670. - #ifndef bcopy
  671.   void bcopy (), bzero ();
  672.   #endif
  673. ! char *malloc (), *realloc ();
  674. ! void free ();
  675.   
  676. ! char *xmalloc ();
  677. ! char *xrealloc ();
  678. ! void usage ();
  679.   void fatal ();
  680.   void fatal_with_file ();
  681.   void perror_name ();
  682. --- 861,875 ----
  683.   struct glosym **cmdline_references;
  684.   int cl_refs_allocated;
  685.   
  686.   void bcopy (), bzero ();
  687. + int malloc (), realloc ();
  688. + #ifndef alloca
  689. + int alloca ();
  690.   #endif
  691. ! int free ();
  692.   
  693. ! int xmalloc ();
  694. ! int xrealloc ();
  695.   void fatal ();
  696.   void fatal_with_file ();
  697.   void perror_name ();
  698. ***************
  699. *** 1022,1030 ****
  700.   void perror_file ();
  701.   void error ();
  702.   
  703. - int parse ();
  704. - void initialize_text_start ();
  705. - void initialize_data_start ();
  706.   void digest_symbols ();
  707.   void print_symbols ();
  708.   void load_symbols ();
  709. --- 876,881 ----
  710. ***************
  711. *** 1054,1070 ****
  712.     page_size = getpagesize ();
  713.     progname = argv[0];
  714.   
  715. - #ifdef RLIMIT_STACK
  716. -   /* Avoid dumping core on large .o files.  */
  717. -   {
  718. -     struct rlimit rl;
  719. -     getrlimit (RLIMIT_STACK, &rl);
  720. -     rl.rlim_cur = rl.rlim_max;
  721. -     setrlimit (RLIMIT_STACK, &rl);
  722. -   }
  723. - #endif
  724.     /* Clear the cumulative info on the output file.  */
  725.   
  726.     text_size = 0;
  727. --- 905,910 ----
  728. ***************
  729. *** 1084,1092 ****
  730. --- 924,934 ----
  731.     discard_locals = DISCARD_NONE;
  732.     entry_symbol = 0;
  733.     write_map = 0;
  734. +   relocatable_output = 0;
  735.     force_common_definition = 0;
  736.     T_flag_specified = 0;
  737.     Tdata_flag_specified = 0;
  738. +   magic = DEFAULT_MAGIC;
  739.     make_executable = 1;
  740.     force_executable = 0;
  741.     set_element_prefixes = 0;
  742. ***************
  743. *** 1105,1111 ****
  744.     common_defined_global_count = 0;
  745.   
  746.     /* Keep a list of symbols referenced from the command line */
  747.     cl_refs_allocated = 10;
  748.     cmdline_references
  749.       = (struct glosym **) xmalloc (cl_refs_allocated
  750. --- 947,952 ----
  751. ***************
  752. *** 1116,1133 ****
  753.   
  754.     decode_command (argc, argv);
  755.   
  756.     /* Load symbols of all input files.
  757.        Also search all libraries and decide which library members to load.  */
  758.   
  759.     load_symbols ();
  760.   
  761. -   /* Create various built-in symbols.  This must occur after
  762. -      all input files are loaded so that a user program can have a
  763. -      symbol named etext (for example).  */
  764. -   if (output_style != OUTPUT_RELOCATABLE)
  765. -     symtab_init ();
  766.     /* Compute where each file's sections go, and relocate symbols.  */
  767.   
  768.     digest_symbols ();
  769. --- 957,1004 ----
  770.   
  771.     decode_command (argc, argv);
  772.   
  773. +   /* Create the symbols `etext', `edata' and `end'.  */
  774. +   if (!relocatable_output)
  775. +     symtab_init ();
  776. +   /* Determine whether to count the header as part of
  777. +      the text size, and initialize the text size accordingly.
  778. +      This depends on the kind of system and on the output format selected.  */
  779. +   N_SET_MAGIC (outheader, magic);
  780. + #ifdef INITIALIZE_HEADER
  781. +   INITIALIZE_HEADER;
  782. + #endif
  783. +   text_size = sizeof (struct exec);
  784. + #ifdef COFF_ENCAPSULATE
  785. +   if (relocatable_output == 0)
  786. +     {
  787. +       need_coff_header = 1;
  788. +       /* set this flag now, since it will change the values of N_TXTOFF, etc */
  789. +       N_SET_FLAGS (outheader, N_FLAGS_COFF_ENCAPSULATE);
  790. +       text_size += sizeof (struct coffheader);
  791. +     }
  792. + #endif
  793. +   text_size -= N_TXTOFF (outheader);
  794. +   if (text_size < 0)
  795. +     text_size = 0;
  796. +   entry_offset = text_size;
  797. +   if (!T_flag_specified && !relocatable_output)
  798. +     text_start = N_TXTADDR (outheader);
  799. +   /* The text-start address is normally this far past a page boundary.  */
  800. +   text_start_alignment = text_start % page_size;
  801.     /* Load symbols of all input files.
  802.        Also search all libraries and decide which library members to load.  */
  803.   
  804.     load_symbols ();
  805.   
  806.     /* Compute where each file's sections go, and relocate symbols.  */
  807.   
  808.     digest_symbols ();
  809. ***************
  810. *** 1149,1191 ****
  811.     exit (!make_executable);
  812.   }
  813.   
  814. ! void add_cmdline_ref ();
  815.   
  816. ! static struct option longopts[] =
  817. ! {
  818. !   {"d", 0, 0, 'd'},
  819. !   {"dc", 0, 0, 'd'},        /* For Sun compatibility. */
  820. !   {"dp", 0, 0, 'd'},        /* For Sun compatibility. */
  821. !   {"e", 1, 0, 'e'},
  822. !   {"n", 0, 0, 'n'},
  823. !   {"noinhibit-exec", 0, 0, 130},
  824. !   {"nostdlib", 0, 0, 133},
  825. !   {"o", 1, 0, 'o'},
  826. !   {"r", 0, 0, 'r'},
  827. !   {"s", 0, 0, 's'},
  828. !   {"t", 0, 0, 't'},
  829. !   {"u", 1, 0, 'u'},
  830. !   {"x", 0, 0, 'x'},
  831. !   {"z", 0, 0, 'z'},
  832. !   {"A", 1, 0, 'A'},
  833. !   {"Bstatic", 0, 0, 129},    /* For Sun compatibility. */
  834. !   {"D", 1, 0, 'D'},
  835. !   {"M", 0, 0, 'M'},
  836. !   {"N", 0, 0, 'N'},
  837. !   {"S", 0, 0, 'S'},
  838. !   {"T", 1, 0, 'T'},
  839. !   {"Ttext", 1, 0, 'T'},
  840. !   {"Tdata", 1, 0, 132},
  841. !   {"V", 1, 0, 'V'},
  842. !   {"X", 0, 0, 'X'},
  843. !   {0, 0, 0, 0}
  844. ! };
  845. ! /* Since the Unix ld accepts -lfoo, -Lfoo, and -yfoo, we must also.
  846. !    This effectively prevents any long options from starting with
  847. !    one of these letters. */
  848. ! #define SHORTOPTS "-l:y:L:"
  849.   
  850.   /* Process the command arguments,
  851.      setting up file_table with an entry for each input file,
  852.      and setting variables according to the options.  */
  853. --- 1020,1072 ----
  854.     exit (!make_executable);
  855.   }
  856.   
  857. ! void decode_option ();
  858.   
  859. ! /* Analyze a command line argument.
  860. !    Return 0 if the argument is a filename.
  861. !    Return 1 if the argument is a option complete in itself.
  862. !    Return 2 if the argument is a option which uses an argument.
  863. !    Thus, the value is the number of consecutive arguments
  864. !    that are part of options.  */
  865. ! int
  866. ! classify_arg (arg)
  867. !      register char *arg;
  868. ! {
  869. !   if (*arg != '-') return 0;
  870. !   switch (arg[1])
  871. !     {
  872. !     case 'A':
  873. !     case 'D':
  874. !     case 'e':
  875. !     case 'L':
  876. !     case 'l':
  877. !     case 'o':
  878. !     case 'u':
  879. !     case 'V':
  880. !     case 'y':
  881. !       if (arg[2])
  882. !     return 1;
  883. !       return 2;
  884. !     case 'B':
  885. !       if (! strcmp (&arg[2], "static"))
  886. !     return 1;
  887. !     case 'T':
  888. !       if (arg[2] == 0)
  889. !     return 2;
  890. !       if (! strcmp (&arg[2], "text"))
  891. !     return 2;
  892. !       if (! strcmp (&arg[2], "data"))
  893. !     return 2;
  894. !       return 1;
  895. !     }
  896.   
  897. +   return 1;
  898. + }
  899.   /* Process the command arguments,
  900.      setting up file_table with an entry for each input file,
  901.      and setting variables according to the options.  */
  902. ***************
  903. *** 1195,1201 ****
  904.        char **argv;
  905.        int argc;
  906.   {
  907. !   int optc, longind;
  908.     register struct file_entry *p;
  909.   
  910.     number_of_files = 0;
  911. --- 1076,1082 ----
  912.        char **argv;
  913.        int argc;
  914.   {
  915. !   register int i;
  916.     register struct file_entry *p;
  917.   
  918.     number_of_files = 0;
  919. ***************
  920. *** 1204,1437 ****
  921.     n_search_dirs = 0;
  922.     search_dirs = (char **) xmalloc (sizeof (char *));
  923.   
  924. !   /* First compute number_of_files so we know how long to make file_table.
  925. !      Also process most options completely.  */
  926. !   while ((optc = getopt_long_only (argc, argv, SHORTOPTS, longopts, &longind))
  927. !      != EOF)
  928. !     {
  929. !       if (optc == 0)
  930. !     optc = longopts[longind].val;
  931. !       switch (optc)
  932. !     {
  933. !     case '?':
  934. !       usage (0, 0);
  935. !       break;
  936. !     case 1:
  937. !       /* Non-option argument. */
  938. !       number_of_files++;
  939. !       break;
  940. !     case 'd':
  941. !       force_common_definition = 1;
  942. !       break;
  943. !     case 'e':
  944. !       entry_symbol = getsym (optarg);
  945. !       if (!entry_symbol->defined && !entry_symbol->referenced)
  946. !         undefined_global_sym_count++;
  947. !       entry_symbol->referenced = 1;
  948. !       add_cmdline_ref (entry_symbol);
  949. !       break;
  950. !     case 'l':
  951. !       number_of_files++;
  952. !       break;
  953. !     case 'n':
  954. !       if (output_style && output_style != OUTPUT_READONLY_TEXT)
  955. !         fatal ("illegal combination of -n with -N, -r, or -z", (char *) 0);
  956. !       output_style = OUTPUT_READONLY_TEXT;
  957. !       break;
  958. !     case 130:        /* -noinhibit-exec */
  959. !       force_executable = 1;
  960. !       break;
  961. !     case 133:        /* -nostdlib */
  962. !       no_standard_dirs = 1;
  963. !       break;
  964. !     case 'o':
  965. !       output_filename = optarg;
  966. !       break;
  967. !     case 'r':
  968. !       if (output_style && output_style != OUTPUT_RELOCATABLE)
  969. !         fatal ("illegal combination of -r with -N, -n, or -z", (char *) 0);
  970. !       output_style = OUTPUT_RELOCATABLE;
  971. !       text_start = 0;
  972. !       break;
  973. !     case 's':
  974. !       strip_symbols = STRIP_ALL;
  975. !       break;
  976. !     case 't':
  977. !       trace_files = 1;
  978. !       break;
  979. !     case 'u':
  980. !       {
  981. !         register symbol *sp = getsym (optarg);
  982. !         if (!sp->defined && !sp->referenced)
  983. !           undefined_global_sym_count++;
  984. !         sp->referenced = 1;
  985. !         add_cmdline_ref (sp);
  986. !       }
  987. !       break;
  988. !     case 'x':
  989. !       discard_locals = DISCARD_ALL;
  990. !       break;
  991. !       
  992. !     case 'y':
  993. !       {
  994. !         register symbol *sp = getsym (optarg);
  995. !         sp->trace = 1;
  996. !       }
  997. !       break;
  998. !     case 'z':
  999. !       if (output_style && output_style != OUTPUT_DEMAND_PAGED)
  1000. !         fatal ("illegal combination of -z with -N, -n, or -r", (char *) 0);
  1001. !       output_style = OUTPUT_DEMAND_PAGED;
  1002. !       break;
  1003. !     case 'A':
  1004. !       number_of_files++;
  1005. !       break;
  1006. !     case 129:        /* -Bstatic. */
  1007. !       /* Ignore. */
  1008. !       break;
  1009. !     case 'D':
  1010. !       specified_data_size = parse (optarg, "%x", "invalid argument to -D");
  1011. !       break;
  1012. !     case 'L':
  1013. !       n_search_dirs++;
  1014. !       search_dirs = (char **)
  1015. !         xrealloc (search_dirs, n_search_dirs * sizeof (char *));
  1016. !       search_dirs[n_search_dirs - 1] = optarg;
  1017. !       break;
  1018. !       
  1019. !     case 'M':
  1020. !       write_map = 1;
  1021. !       break;
  1022. !     case 'N':
  1023. !       if (output_style && output_style != OUTPUT_WRITABLE_TEXT)
  1024. !         fatal ("illegal combination of -N with -n, -r, or -z", (char *) 0);
  1025. !       output_style = OUTPUT_WRITABLE_TEXT;
  1026. !       break;
  1027. !     case 'S':
  1028. !       strip_symbols = STRIP_DEBUGGER;
  1029. !       break;
  1030. !     case 'T':
  1031. !       text_start = parse (optarg, "%x", "invalid argument to -Ttext");
  1032. !       T_flag_specified = 1;
  1033. !       break;
  1034. !     case 132:        /* -Tdata addr */
  1035. !       data_start = parse (optarg, "%x", "invalid argument to -Tdata");
  1036. !       Tdata_flag_specified = 1;
  1037. !       break;
  1038. !     case 'V':
  1039. !       {
  1040. !         struct string_list_element *new
  1041. !           = (struct string_list_element *)
  1042. !         xmalloc (sizeof (struct string_list_element));
  1043. !         
  1044. !         new->str = optarg;
  1045. !         new->next = set_element_prefixes;
  1046. !         set_element_prefixes = new;
  1047. !       }
  1048. !       break;
  1049.   
  1050. !     case 'X':
  1051. !       discard_locals = DISCARD_L;
  1052. !       break;
  1053.       }
  1054.       }
  1055.   
  1056.     if (!number_of_files)
  1057. !     usage ("no input files", 0);
  1058.   
  1059.     p = file_table
  1060.       = (struct file_entry *) xmalloc (number_of_files * sizeof (struct file_entry));
  1061.     bzero (p, number_of_files * sizeof (struct file_entry));
  1062.   
  1063. !   /* Now scan again and fill in file_table.
  1064. !      All options except -A and -l are ignored here.  */
  1065.   
  1066. !   optind = 0;            /* Reset getopt. */
  1067. !   while ((optc = getopt_long_only (argc, argv, SHORTOPTS, longopts, &longind))
  1068. !      != EOF)
  1069. !     {
  1070. !       if (optc == 0)
  1071. !     optc = longopts[longind].val;
  1072. !       switch (optc)
  1073.       {
  1074. !     case 1:
  1075. !       /* Non-option argument. */
  1076. !       p->filename = optarg;
  1077. !       p->local_sym_name = optarg;
  1078. !       p++;
  1079. !       break;
  1080. !     case 'A':
  1081. !       if (p != file_table)
  1082. !         usage ("-A specified before an input file other than the first");
  1083. !       p->filename = optarg;
  1084. !       p->local_sym_name = optarg;
  1085. !       p->just_syms_flag = 1;
  1086. !       p++;
  1087. !       break;
  1088. !     case 'l':
  1089. !       p->filename = concat ("lib", optarg, ".a");
  1090. !       p->local_sym_name = concat ("-l", optarg, "");
  1091. !       p->search_dirs_flag = 1;
  1092.         p++;
  1093. -       break;
  1094.       }
  1095.       }
  1096.   
  1097. -   if (!output_file_type)
  1098. -     output_file_type = DEFAULT_OUTPUT_FILE_TYPE;
  1099. -   if (!output_style)
  1100. -     output_style = DEFAULT_OUTPUT_STYLE;
  1101. - #if 0
  1102. -   /* THIS CONSISTENCY CHECK BELONGS SOMEWHERE ELSE.  */
  1103.     /* Now check some option settings for consistency.  */
  1104.   
  1105. !   if ((output_style == OUTPUT_READONLY_TEXT || output_style == OUTPUT_DEMAND_PAGED)
  1106. !       && (text_start - text_start_alignment) & (page_size - 1))
  1107. !     usage ("-T argument not multiple of page size, with sharable output", 0);
  1108.   #endif
  1109.   
  1110.     /* Append the standard search directories to the user-specified ones.  */
  1111. !   if (!no_standard_dirs)
  1112. !     {
  1113. !       int n = sizeof standard_search_dirs / sizeof standard_search_dirs[0];
  1114. !       n_search_dirs += n;
  1115. !       search_dirs
  1116. !     = (char **) xrealloc (search_dirs, n_search_dirs * sizeof (char *));
  1117. !       bcopy (standard_search_dirs, &search_dirs[n_search_dirs - n],
  1118. !          n * sizeof (char *));
  1119. !     }
  1120.   }
  1121.   
  1122.   
  1123. --- 1085,1180 ----
  1124.     n_search_dirs = 0;
  1125.     search_dirs = (char **) xmalloc (sizeof (char *));
  1126.   
  1127. !   /* First compute number_of_files so we know how long to make file_table.  */
  1128. !   /* Also process most options completely.  */
  1129.   
  1130. !   for (i = 1; i < argc; i++)
  1131. !     {
  1132. !       register int code = classify_arg (argv[i]);
  1133. !       if (code)
  1134. !     {
  1135. !       if (i + code > argc)
  1136. !         fatal ("no argument following %s\n", argv[i]);
  1137. !       decode_option (argv[i], argv[i+1]);
  1138. !       if (argv[i][1] == 'l' || argv[i][1] == 'A')
  1139. !         number_of_files++;
  1140. !       i += code - 1;
  1141.       }
  1142. +       else
  1143. +     number_of_files++;
  1144.       }
  1145.   
  1146.     if (!number_of_files)
  1147. !     fatal ("no input files", 0);
  1148.   
  1149.     p = file_table
  1150.       = (struct file_entry *) xmalloc (number_of_files * sizeof (struct file_entry));
  1151.     bzero (p, number_of_files * sizeof (struct file_entry));
  1152.   
  1153. !   /* Now scan again and fill in file_table.  */
  1154. !   /* All options except -A and -l are ignored here.  */
  1155.   
  1156. !   for (i = 1; i < argc; i++)
  1157. !     {
  1158. !       register int code = classify_arg (argv[i]);
  1159. !       if (code)
  1160. !     {
  1161. !       char *string;
  1162. !       if (code == 2)
  1163. !         string = argv[i+1];
  1164. !       else
  1165. !         string = &argv[i][2];
  1166. !       if (argv[i][1] == 'A')
  1167. !         {
  1168. !           if (p != file_table)
  1169. !         fatal ("-A specified before an input file other than the first");
  1170. !           p->filename = string;
  1171. !           p->local_sym_name = string;
  1172. !           p->just_syms_flag = 1;
  1173. !           p++;
  1174. !         }
  1175. !       if (argv[i][1] == 'l')
  1176. !         {
  1177. !           p->filename = concat ("lib", string, ".a");
  1178. !           p->local_sym_name = concat ("-l", string, "");
  1179. !           p->search_dirs_flag = 1;
  1180. !           p++;
  1181. !         }
  1182. !       i += code - 1;
  1183. !     }
  1184. !       else
  1185.       {
  1186. !       p->filename = argv[i];
  1187. !       p->local_sym_name = argv[i];
  1188.         p++;
  1189.       }
  1190.       }
  1191.   
  1192.     /* Now check some option settings for consistency.  */
  1193.   
  1194. ! #ifdef NMAGIC
  1195. !   if ((magic == ZMAGIC || magic == NMAGIC)
  1196. ! #else
  1197. !   if ((magic == ZMAGIC)
  1198.   #endif
  1199. +       && (text_start - text_start_alignment) & (page_size - 1))
  1200. +     fatal ("-T argument not multiple of page size, with sharable output", 0);
  1201.   
  1202.     /* Append the standard search directories to the user-specified ones.  */
  1203. !   {
  1204. !     int n = sizeof standard_search_dirs / sizeof standard_search_dirs[0];
  1205. !     n_search_dirs += n;
  1206. !     search_dirs
  1207. !       = (char **) xrealloc (search_dirs, n_search_dirs * sizeof (char *));
  1208. !     bcopy (standard_search_dirs, &search_dirs[n_search_dirs - n],
  1209. !        n * sizeof (char *));
  1210. !   }
  1211.   }
  1212.   
  1213.   
  1214. ***************
  1215. *** 1449,1455 ****
  1216.     if (ptr >= cmdline_references + cl_refs_allocated - 1)
  1217.       {
  1218.         int diff = ptr - cmdline_references;
  1219.         cl_refs_allocated *= 2;
  1220.         cmdline_references = (struct glosym **)
  1221.       xrealloc (cmdline_references,
  1222. --- 1192,1198 ----
  1223.     if (ptr >= cmdline_references + cl_refs_allocated - 1)
  1224.       {
  1225.         int diff = ptr - cmdline_references;
  1226. !       
  1227.         cl_refs_allocated *= 2;
  1228.         cmdline_references = (struct glosym **)
  1229.       xrealloc (cmdline_references,
  1230. ***************
  1231. *** 1456,1466 ****
  1232.            cl_refs_allocated * sizeof (struct glosym *));
  1233.         ptr = cmdline_references + diff;
  1234.       }
  1235.     *ptr++ = sp;
  1236.     *ptr = (struct glosym *) 0;
  1237.   }
  1238.   int
  1239.   set_element_prefixed_p (name)
  1240.        char *name;
  1241. --- 1199,1209 ----
  1242.            cl_refs_allocated * sizeof (struct glosym *));
  1243.         ptr = cmdline_references + diff;
  1244.       }
  1245. !   
  1246.     *ptr++ = sp;
  1247.     *ptr = (struct glosym *) 0;
  1248.   }
  1249. !     
  1250.   int
  1251.   set_element_prefixed_p (name)
  1252.        char *name;
  1253. ***************
  1254. *** 1478,1486 ****
  1255.       }
  1256.     return 0;
  1257.   }
  1258.   
  1259. ! /* Convenient functions for operating on one or all files being
  1260. !    loaded.  */
  1261.   void print_file_name ();
  1262.   
  1263.   /* Call FUNCTION on each input file entry.
  1264. --- 1221,1384 ----
  1265.       }
  1266.     return 0;
  1267.   }
  1268. + int parse ();
  1269. + /* Record an option and arrange to act on it later.
  1270. +    ARG should be the following command argument,
  1271. +    which may or may not be used by this option.
  1272. +    The `l' and `A' options are ignored here since they actually
  1273. +    specify input files.  */
  1274. + void
  1275. + decode_option (swt, arg)
  1276. +      register char *swt, *arg;
  1277. + {
  1278. +   /* We get Bstatic from gcc on suns.  */
  1279. +   if (! strcmp (swt + 1, "Bstatic"))
  1280. +     return;
  1281. +   if (! strcmp (swt + 1, "Ttext"))
  1282. +     {
  1283. +       text_start = parse (arg, "%x", "invalid argument to -Ttext");
  1284. +       T_flag_specified = 1;
  1285. +       return;
  1286. +     }
  1287. +   if (! strcmp (swt + 1, "Tdata"))
  1288. +     {
  1289. +       data_start = parse (arg, "%x", "invalid argument to -Tdata");
  1290. +       Tdata_flag_specified = 1;
  1291. +       return;
  1292. +     }
  1293. +   if (! strcmp (swt + 1, "noinhibit-exec"))
  1294. +     {
  1295. +       force_executable = 1;
  1296. +       return;
  1297. +     }
  1298. +   if (swt[2] != 0)
  1299. +     arg = &swt[2];
  1300. +   switch (swt[1])
  1301. +     {
  1302. +     case 'A':
  1303. +       return;
  1304. +     case 'D':
  1305. +       specified_data_size = parse (arg, "%x", "invalid argument to -D");
  1306. +       return;
  1307. +     case 'd':
  1308. +       force_common_definition = 1;
  1309. +       return;
  1310. +     case 'e':
  1311. +       entry_symbol = getsym (arg);
  1312. +       if (!entry_symbol->defined && !entry_symbol->referenced)
  1313. +     undefined_global_sym_count++;
  1314. +       entry_symbol->referenced = 1;
  1315. +       add_cmdline_ref (entry_symbol);
  1316. +       return;
  1317. +     case 'l':
  1318. +       return;
  1319. +     case 'L':
  1320. +       n_search_dirs++;
  1321. +       search_dirs
  1322. +     = (char **) xrealloc (search_dirs, n_search_dirs * sizeof (char *));
  1323. +       search_dirs[n_search_dirs - 1] = arg;
  1324. +       return;
  1325. +     case 'M':
  1326. +       write_map = 1;
  1327. +       return;
  1328. +     case 'N':
  1329. +       magic = OMAGIC;
  1330. +       return;
  1331. + #ifdef NMAGIC
  1332. +     case 'n':
  1333. +       magic = NMAGIC;
  1334. +       return;
  1335. + #endif
  1336. +     case 'o':
  1337. +       output_filename = arg;
  1338. +       return;
  1339. +     case 'r':
  1340. +       relocatable_output = 1;
  1341. +       magic = OMAGIC;
  1342. +       text_start = 0;
  1343. +       return;
  1344. +     case 'S':
  1345. +       strip_symbols = STRIP_DEBUGGER;
  1346. +       return;
  1347. +     case 's':
  1348. +       strip_symbols = STRIP_ALL;
  1349. +       return;
  1350. +     case 'T':
  1351. +       text_start = parse (arg, "%x", "invalid argument to -T");
  1352. +       T_flag_specified = 1;
  1353. +       return;
  1354. +     case 't':
  1355. +       trace_files = 1;
  1356. +       return;
  1357. +     case 'u':
  1358. +       {
  1359. +     register symbol *sp = getsym (arg);
  1360. +     if (!sp->defined && !sp->referenced)
  1361. +       undefined_global_sym_count++;
  1362. +     sp->referenced = 1;
  1363. +     add_cmdline_ref (sp);
  1364. +       }
  1365. +       return;
  1366. +     case 'V':
  1367. +       {
  1368. +     struct string_list_element *new
  1369. +       = (struct string_list_element *)
  1370. +         xmalloc (sizeof (struct string_list_element));
  1371. +     new->str = arg;
  1372. +     new->next = set_element_prefixes;
  1373. +     set_element_prefixes = new;
  1374. +     return;
  1375. +       }
  1376. +     case 'X':
  1377. +       discard_locals = DISCARD_L;
  1378. +       return;
  1379. +     case 'x':
  1380. +       discard_locals = DISCARD_ALL;
  1381. +       return;
  1382. +     case 'y':
  1383. +       {
  1384. +     register symbol *sp = getsym (&swt[2]);
  1385. +     sp->trace = 1;
  1386. +       }
  1387. +       return;
  1388. +     case 'z':
  1389. +       magic = ZMAGIC;
  1390. +       return;
  1391. +     default:
  1392. +       fatal ("invalid command option `%s'", swt);
  1393. +     }
  1394. + }
  1395.   
  1396. ! /** Convenient functions for operating on one or all files being */
  1397. !  /** loaded.  */
  1398.   void print_file_name ();
  1399.   
  1400.   /* Call FUNCTION on each input file entry.
  1401. ***************
  1402. *** 1596,1603 ****
  1403.   
  1404.     if (input_file) file_close ();
  1405.   
  1406. !   if (entry->search_dirs_flag && n_search_dirs)
  1407.       {
  1408.         int i;
  1409.   
  1410.         for (i = 0; i < n_search_dirs; i++)
  1411. --- 1494,1502 ----
  1412.   
  1413.     if (input_file) file_close ();
  1414.   
  1415. !   if (entry->search_dirs_flag)
  1416.       {
  1417. +       register char **p = search_dirs;
  1418.         int i;
  1419.   
  1420.         for (i = 0; i < n_search_dirs; i++)
  1421. ***************
  1422. *** 1681,1971 ****
  1423.   
  1424.   /* Medium-level input routines for rel files.  */
  1425.   
  1426. ! /* Determine whether the given ENTRY is an archive, a BSD a.out file,
  1427. !    a Mach-O file, or whatever.  DESC is the descriptor on which the
  1428. !    file is open.  */
  1429. ! void
  1430. ! deduce_file_type(desc, entry)
  1431. !      int desc;
  1432. !      struct file_entry *entry;
  1433. ! {
  1434. !   int len;
  1435. !   {
  1436. !     char magic[SARMAG];
  1437. !     
  1438. !     lseek (desc, entry->starting_offset, 0);
  1439. !     len = read (desc, magic, SARMAG);
  1440. !     if (len == SARMAG && !strncmp(magic, ARMAG, SARMAG))
  1441. !       {
  1442. !     entry->file_type = IS_ARCHIVE;
  1443. !     return;
  1444. !       }
  1445. !   }
  1446. ! #ifdef A_OUT
  1447. !   {
  1448. !     struct exec hdr;
  1449. !     lseek (desc, entry->starting_offset, 0);
  1450. ! #ifdef COFF_ENCAPSULATE
  1451. !     if (entry->just_syms_flag)
  1452. !       /* Since a file given with -A will have a coff header, unlike normal
  1453. !     input files, we need to skip over it.  */
  1454. !       lseek (desc, sizeof (coffheader), SEEK_CUR);
  1455. ! #endif
  1456. !     len = read (desc, (char *) &hdr, sizeof (struct exec));
  1457. !     if (len == sizeof (struct exec) && !N_BADMAG (hdr))
  1458. !       {
  1459. !     entry->file_type = IS_A_OUT;
  1460. !     return;
  1461. !       }
  1462. !   }
  1463. ! #endif
  1464. ! #ifdef MACH_O
  1465. !   {
  1466. !     struct mach_header hdr;
  1467. !     lseek (desc, entry->starting_offset, 0);
  1468. !     len = read (desc, (char *) &hdr, sizeof (struct mach_header));
  1469. !     if (len == sizeof (struct mach_header) && hdr.magic == MH_MAGIC)
  1470. !       {
  1471. !     entry->file_type = IS_MACH_O;
  1472. !     return;
  1473. !       }
  1474. !   }
  1475. ! #endif
  1476. !   fatal_with_file ("malformed input file (not rel or archive) ", entry);
  1477. ! }
  1478. ! #ifdef A_OUT
  1479. ! /* Read an a.out file's header and set up the fields of
  1480. !    the ENTRY accordingly.  DESC is the descriptor on which
  1481. !    the file is open.  */
  1482. ! void
  1483. ! read_a_out_header (desc, entry)
  1484. !      int desc;
  1485. !      struct file_entry *entry;
  1486. ! {
  1487. !   register int len;
  1488. !   struct exec hdr;
  1489. !   struct stat st;
  1490. !   lseek (desc, entry->starting_offset, 0);
  1491. ! #ifdef COFF_ENCAPSULATE
  1492. !   if (entry->just_syms_flag)
  1493. !     /* Since a file given with -A will have a coff header, unlike normal
  1494. !        input files, we need to skip over it.  */
  1495. !     lseek (desc, sizeof (coffheader), SEEK_CUR);
  1496. ! #endif
  1497. !   read (desc, (char *) &hdr, sizeof (struct exec));
  1498. ! #ifdef READ_HEADER_HOOK
  1499. !   READ_HEADER_HOOK(hdr.a_machtype);
  1500. ! #endif
  1501. !   if (entry->just_syms_flag)
  1502. !     entry->orig_text_address = N_TXTADDR(hdr);
  1503. !   else
  1504. !     entry->orig_text_address = 0;
  1505. !   entry->text_size = hdr.a_text;
  1506. !   entry->text_offset = N_TXTOFF(hdr);
  1507. !   entry->text_reloc_size = hdr.a_trsize;
  1508. ! #ifdef N_TRELOFF
  1509. !   entry->text_reloc_offset = N_TRELOFF(hdr);
  1510. ! #else
  1511. ! #ifdef N_DATOFF
  1512. !   entry->text_reloc_offset = N_DATOFF(hdr) + hdr.a_data;
  1513. ! #else
  1514. !   entry->text_reloc_offset = N_TXTOFF(hdr) + hdr.a_text + hdr.a_data;
  1515. ! #endif
  1516. ! #endif
  1517. !   if (entry->just_syms_flag)
  1518. !     entry->orig_data_address = N_DATADDR(hdr);
  1519. !   else
  1520. !     entry->orig_data_address = entry->text_size;
  1521. !   entry->data_size = hdr.a_data;
  1522. ! #ifdef N_DATOFF
  1523. !   entry->data_offset = N_DATOFF(hdr);
  1524. ! #else
  1525. !   entry->data_offset = N_TXTOFF(hdr) + hdr.a_text;
  1526. ! #endif
  1527. !   entry->data_reloc_size = hdr.a_drsize;
  1528. ! #ifdef N_DRELOFF
  1529. !   entry->data_reloc_offset = N_DRELOFF(hdr);
  1530. ! #else
  1531. !   entry->data_reloc_offset = entry->text_reloc_offset + entry->text_reloc_size;
  1532. ! #endif
  1533. ! #ifdef N_BSSADDR
  1534. !   if (entry->just_syms_flag)
  1535. !     entry->orig_bss_address = N_BSSADDR(hdr);
  1536. !   else
  1537. ! #endif
  1538. !   entry->orig_bss_address = entry->orig_data_address + entry->data_size;
  1539. !   entry->bss_size = hdr.a_bss;
  1540. !   entry->syms_size = hdr.a_syms;
  1541. !   entry->syms_offset = N_SYMOFF(hdr);
  1542. !   entry->strs_offset = N_STROFF(hdr);
  1543. !   lseek(desc, entry->starting_offset + entry->strs_offset, 0);
  1544. !   if (read(desc, (char *) &entry->strs_size, sizeof (unsigned long int))
  1545. !       != sizeof (unsigned long int))
  1546. !     fatal_with_file ("failure reading string table size of ", entry);
  1547. !   if (!entry->superfile)
  1548. !     {
  1549. !       fstat(desc, &st);
  1550. !       if (st.st_size > entry->strs_offset + entry->strs_size)
  1551. !     {
  1552. !       entry->symseg_size = st.st_size - (entry->strs_offset + entry->strs_size);
  1553. !       entry->symseg_offset = entry->strs_offset + entry->strs_size;
  1554. !     }
  1555. !     }
  1556. !   else
  1557. !     if (entry->total_size > entry->strs_offset + entry->strs_size)
  1558. !       {
  1559. !     entry->symseg_size = entry->total_size - (entry->strs_offset + entry->strs_size);
  1560. !     entry->symseg_offset = entry->strs_offset + entry->strs_size;
  1561. !       }
  1562. ! }
  1563. ! #endif
  1564. ! #ifdef MACH_O
  1565. ! /* Read a Mach-O file's header.  DESC is the descriptor on which the
  1566. !    file is open, and ENTRY is the file's entry.  */
  1567. ! void
  1568. ! read_mach_o_header (desc, entry)
  1569. !      int desc;
  1570. !      struct file_entry *entry;
  1571. ! {
  1572. !   struct mach_header mach_header;
  1573. !   char *hdrbuf;
  1574. !   struct load_command *load_command;
  1575. !   struct segment_command *segment_command;
  1576. !   struct section *section;
  1577. !   struct symtab_command *symtab_command;
  1578. ! #ifdef LC_SYMSEG
  1579. !   struct symseg_command *symseg_command;
  1580. ! #endif;
  1581. !   int ordinal;
  1582. !   int symtab_seen, symseg_seen;
  1583. !   int len, cmd, seg;
  1584. !   entry->text_ordinal = entry->data_ordinal = entry->bss_ordinal = 0;
  1585. !   symtab_seen = symseg_seen = 0;
  1586. !   ordinal = 1;
  1587. !   lseek (desc, entry->starting_offset, 0);
  1588. !   len = read (desc, (char *) &mach_header, sizeof (struct mach_header));
  1589. !   if (len != sizeof (struct mach_header))
  1590. !     fatal_with_file ("failure reading Mach-O header of ", entry);
  1591. !   if (mach_header.filetype != MH_OBJECT && mach_header.filetype != MH_EXECUTE)
  1592. !     fatal_with_file ("unsupported Mach-O file type (not MH_OBJECT or MH_EXECUTE) in ", entry);
  1593. !   hdrbuf = xmalloc (mach_header.sizeofcmds);
  1594. !   len = read (desc, hdrbuf, mach_header.sizeofcmds);
  1595. !   if (len != mach_header.sizeofcmds)
  1596. !     fatal_with_file ("failure reading Mach-O load commands of ", entry);
  1597. !   load_command = (struct load_command *) hdrbuf;
  1598. !   for (cmd = 0; cmd < mach_header.ncmds; ++cmd)
  1599. !     {
  1600. !       switch (load_command->cmd)
  1601. !     {
  1602. !     case LC_SEGMENT:
  1603. !       segment_command = (struct segment_command *) load_command;
  1604. !       section = (struct section *) ((char *) (segment_command + 1));
  1605. !       for (seg = 0; seg < segment_command->nsects; ++seg, ++section, ++ordinal)
  1606. !         {
  1607. !           if (!strncmp(SECT_TEXT, section->sectname, sizeof section->sectname))
  1608. !         if (entry->text_ordinal)
  1609. !           fatal_with_file ("more than one __text section in ", entry);
  1610. !         else
  1611. !           {
  1612. !             entry->text_ordinal = ordinal;
  1613. !             entry->orig_text_address = section->addr;
  1614. !             entry->text_size = section->size;
  1615. !             entry->text_offset = section->offset;
  1616. !             entry->text_reloc_size = section->nreloc * sizeof (struct relocation_info);
  1617. !             entry->text_reloc_offset = section->reloff;
  1618. !           }
  1619. !           else if (!strncmp(SECT_DATA, section->sectname, sizeof section->sectname))
  1620. !         if (entry->data_ordinal)
  1621. !           fatal_with_file ("more than one __data section in ", entry);
  1622. !         else
  1623. !           {
  1624. !             entry->data_ordinal = ordinal;
  1625. !             entry->orig_data_address = section->addr;
  1626. !             entry->data_size = section->size;
  1627. !             entry->data_offset = section->offset;
  1628. !             entry->data_reloc_size = section->nreloc * sizeof (struct relocation_info);
  1629. !             entry->data_reloc_offset = section->reloff;
  1630. !           }
  1631. !           else if (!strncmp(SECT_BSS, section->sectname, sizeof section->sectname))
  1632. !         if (entry->bss_ordinal)
  1633. !           fatal_with_file ("more than one __bss section in ", entry);
  1634. !         else
  1635. !           {
  1636. !             entry->bss_ordinal = ordinal;
  1637. !             entry->orig_bss_address = section->addr;
  1638. !             entry->bss_size = section->size;
  1639. !           }
  1640. !           else
  1641. !         if (section->size != 0)
  1642. !           fprintf (stderr, "%s: warning: unknown section `%.*s' in %s\n",
  1643. !                progname, sizeof section->sectname, section->sectname,
  1644. !                entry->filename);
  1645. !         }
  1646. !       break;
  1647. !     case LC_SYMTAB:
  1648. !       if (symtab_seen)
  1649. !           fatal_with_file ("more than one LC_SYMTAB in ", entry);
  1650. !       else
  1651. !         {
  1652. !           symtab_seen = 1;
  1653. !           symtab_command = (struct symtab_command *) load_command;
  1654. !           entry->syms_size = symtab_command->nsyms * sizeof (struct nlist);
  1655. !           entry->syms_offset = symtab_command->symoff;
  1656. !           entry->strs_size = symtab_command->strsize;
  1657. !           entry->strs_offset = symtab_command->stroff;
  1658. !         }
  1659. !       break;
  1660. ! #ifdef LC_SYMSEG
  1661. !     case LC_SYMSEG:
  1662. !       if (symseg_seen)
  1663. !         fatal_with_file ("more than one LC_SYMSEG in ", entry);
  1664. !       else
  1665. !         {
  1666. !           symseg_seen = 1;
  1667. !           symseg_command = (struct symseg_command *) load_command;
  1668. !           entry->symseg_size = symseg_command->size;
  1669. !           entry->symseg_offset = symseg_command->offset;
  1670. !         }
  1671. !       break;
  1672. ! #endif
  1673. !     }
  1674. !       load_command = (struct load_command *)
  1675. !     ((char *) load_command + load_command->cmdsize);
  1676. !     }
  1677. !   free (hdrbuf);
  1678. !   if (!symtab_seen)
  1679. !     fprintf (stderr, "%s: no symbol table in %s\n", progname, entry->filename);
  1680. ! }
  1681. ! #endif
  1682. ! /* Read a file's header info into the proper place in the file_entry.
  1683.      DESC is the descriptor on which the file is open.
  1684. !    ENTRY is the file's entry.
  1685. !    Switch in the file_type to determine the appropriate actual
  1686. !    header reading routine to call.  */
  1687.   
  1688.   void
  1689.   read_header (desc, entry)
  1690. --- 1580,1588 ----
  1691.   
  1692.   /* Medium-level input routines for rel files.  */
  1693.   
  1694. ! /* Read a file's header into the proper place in the file_entry.
  1695.      DESC is the descriptor on which the file is open.
  1696. !    ENTRY is the file's entry.  */
  1697.   
  1698.   void
  1699.   read_header (desc, entry)
  1700. ***************
  1701. *** 1972,2009 ****
  1702.        int desc;
  1703.        register struct file_entry *entry;
  1704.   {
  1705. !   if (!entry->file_type)
  1706. !     deduce_file_type (desc, entry);
  1707. !   switch (entry->file_type)
  1708. !     {
  1709. !     case IS_ARCHIVE:
  1710. !     default:
  1711. !       /* Should never happen. */
  1712. !       abort ();
  1713. ! #ifdef A_OUT
  1714. !     case IS_A_OUT:
  1715. !       read_a_out_header (desc, entry);
  1716. !       break;
  1717. ! #endif
  1718.   
  1719. ! #ifdef MACH_O
  1720. !     case IS_MACH_O:
  1721. !       read_mach_o_header (desc, entry);
  1722. !       break;
  1723. ! #endif
  1724. !     }
  1725.   
  1726.     entry->header_read_flag = 1;
  1727.   }
  1728.   
  1729. - #ifdef MACH_O
  1730. - void translate_mach_o_symbols ();
  1731. - #endif
  1732.   /* Read the symbols of file ENTRY into core.
  1733. !    Assume it is already open, on descriptor DESC.  */
  1734.   
  1735.   void
  1736.   read_entry_symbols (desc, entry)
  1737. --- 1589,1611 ----
  1738.        int desc;
  1739.        register struct file_entry *entry;
  1740.   {
  1741. !   register int len;
  1742. !   struct exec *loc = (struct exec *) &entry->header;
  1743.   
  1744. !   lseek (desc, entry->starting_offset, 0);
  1745. !   len = read (desc, loc, sizeof (struct exec));
  1746. !   if (len != sizeof (struct exec))
  1747. !     fatal_with_file ("failure reading header of ", entry);
  1748. !   if (N_BADMAG (*loc))
  1749. !     fatal_with_file ("bad magic number in ", entry);
  1750.   
  1751.     entry->header_read_flag = 1;
  1752.   }
  1753.   
  1754.   /* Read the symbols of file ENTRY into core.
  1755. !    Assume it is already open, on descriptor DESC.
  1756. !    Also read the length of the string table, which follows the symbol table,
  1757. !    but don't read the contents of the string table.  */
  1758.   
  1759.   void
  1760.   read_entry_symbols (desc, entry)
  1761. ***************
  1762. *** 2015,2034 ****
  1763.     if (!entry->header_read_flag)
  1764.       read_header (desc, entry);
  1765.   
  1766. !   entry->symbols = (struct nlist *) xmalloc (entry->syms_size);
  1767.   
  1768. !   lseek (desc, entry->syms_offset + entry->starting_offset, 0);
  1769. !   if (entry->syms_size != read (desc, entry->symbols, entry->syms_size))
  1770.       fatal_with_file ("premature end of file in symbols of ", entry);
  1771.   
  1772. ! #ifdef MACH_O
  1773. !   if (entry->file_type == IS_MACH_O)
  1774. !     translate_mach_o_symbols (entry);
  1775. ! #endif
  1776.   }
  1777.   
  1778.   /* Read the string table of file ENTRY into core.
  1779. !    Assume it is already open, on descriptor DESC.  */
  1780.   
  1781.   void
  1782.   read_entry_strings (desc, entry)
  1783. --- 1617,1638 ----
  1784.     if (!entry->header_read_flag)
  1785.       read_header (desc, entry);
  1786.   
  1787. !   entry->symbols = (struct nlist *) xmalloc (entry->header.a_syms);
  1788.   
  1789. !   lseek (desc, N_SYMOFF (entry->header) + entry->starting_offset, 0);
  1790. !   if (entry->header.a_syms != read (desc, entry->symbols, entry->header.a_syms))
  1791.       fatal_with_file ("premature end of file in symbols of ", entry);
  1792.   
  1793. !   lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  1794. !   if (sizeof str_size != read (desc, &str_size, sizeof str_size))
  1795. !     fatal_with_file ("bad string table size in ", entry);
  1796. !   entry->string_size = str_size;
  1797.   }
  1798.   
  1799.   /* Read the string table of file ENTRY into core.
  1800. !    Assume it is already open, on descriptor DESC.
  1801. !    Also record whether a GDB symbol segment follows the string table.  */
  1802.   
  1803.   void
  1804.   read_entry_strings (desc, entry)
  1805. ***************
  1806. *** 2040,2048 ****
  1807.     if (!entry->header_read_flag)
  1808.       read_header (desc, entry);
  1809.   
  1810. !   lseek (desc, entry->strs_offset + entry->starting_offset, 0);
  1811. !   if (entry->strs_size != read (desc, entry->strings, entry->strs_size))
  1812.       fatal_with_file ("premature end of file in strings of ", entry);
  1813.   }
  1814.   
  1815.   /* Read in the symbols of all input files.  */
  1816. --- 1644,1671 ----
  1817.     if (!entry->header_read_flag)
  1818.       read_header (desc, entry);
  1819.   
  1820. !   lseek (desc, N_STROFF (entry->header) + entry->starting_offset, 0);
  1821. !   if (entry->string_size != read (desc, entry->strings, entry->string_size))
  1822.       fatal_with_file ("premature end of file in strings of ", entry);
  1823. +   /* While we are here, see if the file has a symbol segment at the end.
  1824. +      For a separate file, just try reading some more.
  1825. +      For a library member, compare current pos against total size.  */
  1826. +   if (entry->superfile)
  1827. +     {
  1828. +       if (entry->total_size == N_STROFF (entry->header) + entry->string_size)
  1829. +     return;
  1830. +     }
  1831. +   else
  1832. +     {
  1833. +       buffer = read (desc, &buffer, sizeof buffer);
  1834. +       if (buffer == 0)
  1835. +     return;
  1836. +       if (buffer != sizeof buffer)
  1837. +     fatal_with_file ("premature end of file in GDB symbol segment of ", entry);
  1838. +     }
  1839. +   entry->symseg_offset = N_STROFF (entry->header) + entry->string_size;
  1840.   }
  1841.   
  1842.   /* Read in the symbols of all input files.  */
  1843. ***************
  1844. *** 2075,2099 ****
  1845.        register struct file_entry *entry;
  1846.   {
  1847.     register int desc;
  1848.   
  1849.     desc = file_open (entry);
  1850.   
  1851. !   if (!entry->file_type)
  1852. !     deduce_file_type (desc, entry);
  1853.   
  1854. !   if (entry->file_type == IS_ARCHIVE)
  1855. !     {
  1856. !       entry->library_flag = 1;
  1857. !       search_library (desc, entry);
  1858. !     }
  1859. !   else
  1860.       {
  1861.         read_entry_symbols (desc, entry);
  1862. !       entry->strings = (char *) alloca (entry->strs_size);
  1863.         read_entry_strings (desc, entry);
  1864.         enter_file_symbols (entry);
  1865.         entry->strings = 0;
  1866.       }
  1867.   
  1868.     file_close ();
  1869.   }
  1870. --- 1698,1730 ----
  1871.        register struct file_entry *entry;
  1872.   {
  1873.     register int desc;
  1874. +   register int len;
  1875. +   struct exec hdr;
  1876.   
  1877.     desc = file_open (entry);
  1878.   
  1879. !   len = read (desc, &hdr, sizeof hdr);
  1880. !   if (len != sizeof hdr)
  1881. !     fatal_with_file ("failure reading header of ", entry);
  1882.   
  1883. !   if (!N_BADMAG (hdr))
  1884.       {
  1885.         read_entry_symbols (desc, entry);
  1886. !       entry->strings = (char *) alloca (entry->string_size);
  1887.         read_entry_strings (desc, entry);
  1888.         enter_file_symbols (entry);
  1889.         entry->strings = 0;
  1890.       }
  1891. +   else
  1892. +     {
  1893. +       char armag[SARMAG];
  1894. +       lseek (desc, 0, 0);
  1895. +       if (SARMAG != read (desc, armag, SARMAG) || strncmp (armag, ARMAG, SARMAG))
  1896. +     fatal_with_file ("malformed input file (not rel or archive) ", entry);
  1897. +       entry->library_flag = 1;
  1898. +       search_library (desc, entry);
  1899. +     }
  1900.   
  1901.     file_close ();
  1902.   }
  1903. ***************
  1904. *** 2106,2112 ****
  1905.   {
  1906.     register struct nlist
  1907.       *p,
  1908. !     *end = entry->symbols + entry->syms_size / sizeof (struct nlist);
  1909.   
  1910.     if (trace_files) prline_file_name (entry, stderr);
  1911.   
  1912. --- 1737,1744 ----
  1913.   {
  1914.     register struct nlist
  1915.       *p,
  1916. !     *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  1917. !   int lowest_set_vector = -1;
  1918.   
  1919.     if (trace_files) prline_file_name (entry, stderr);
  1920.   
  1921. ***************
  1922. *** 2120,2126 ****
  1923.         if (SET_ELEMENT_P (p->n_type))
  1924.       {
  1925.         set_symbol_count++;
  1926. !       if (output_style != OUTPUT_RELOCATABLE)
  1927.           enter_global_ref (p, p->n_un.n_strx + entry->strings, entry);
  1928.       }
  1929.         else if (p->n_type == N_WARNING)
  1930. --- 1752,1758 ----
  1931.         if (SET_ELEMENT_P (p->n_type))
  1932.       {
  1933.         set_symbol_count++;
  1934. !       if (!relocatable_output)
  1935.           enter_global_ref (p, p->n_un.n_strx + entry->strings, entry);
  1936.       }
  1937.         else if (p->n_type == N_WARNING)
  1938. ***************
  1939. *** 2139,2145 ****
  1940.         else
  1941.           {
  1942.             symbol *sp;
  1943. !           char *sname = p->n_un.n_strx + entry->strings;
  1944.             /* Deal with the warning symbol.  */
  1945.             enter_global_ref (p, p->n_un.n_strx + entry->strings, entry);
  1946.             sp = getsym (sname);
  1947. --- 1771,1777 ----
  1948.         else
  1949.           {
  1950.             symbol *sp;
  1951. !           char *sname = p->n_un.n_strx + entry->strings; 
  1952.             /* Deal with the warning symbol.  */
  1953.             enter_global_ref (p, p->n_un.n_strx + entry->strings, entry);
  1954.             sp = getsym (sname);
  1955. ***************
  1956. *** 2230,2242 ****
  1957.         /* Indirect symbols value should be modified to point
  1958.            a symbol being equivalenced to. */
  1959.         nlist_p->n_value
  1960. - #ifndef NeXT
  1961.           = (unsigned int) getsym ((nlist_p + 1)->n_un.n_strx
  1962.                        + entry->strings);
  1963. - #else
  1964. -         /* NeXT also has indirection but they do it weirdly. */
  1965. -         = (unsigned int) getsym (nlist_p->n_value + entry->strings);
  1966. - #endif
  1967.         if ((symbol *) nlist_p->n_value == sp)
  1968.           {
  1969.             /* Somebody redefined a symbol to be itself.  */
  1970. --- 1862,1869 ----
  1971. ***************
  1972. *** 2282,2288 ****
  1973.     if (sp->trace)
  1974.       {
  1975.         register char *reftype;
  1976. !       switch (type & ~N_EXT)
  1977.       {
  1978.       case N_UNDF:
  1979.         if (nlist_p->n_value)
  1980. --- 1909,1915 ----
  1981.     if (sp->trace)
  1982.       {
  1983.         register char *reftype;
  1984. !       switch (type & N_TYPE)
  1985.       {
  1986.       case N_UNDF:
  1987.         if (nlist_p->n_value)
  1988. ***************
  1989. *** 2327,2335 ****
  1990.         break;
  1991.   
  1992.       case N_INDR:
  1993. !       reftype = (char *) alloca (23 + strlen (((symbol *) nlist_p->n_value)->name));
  1994.         sprintf (reftype, "defined equivalent to %s",
  1995. !            ((symbol *) nlist_p->n_value)->name);
  1996.         break;
  1997.   
  1998.   #ifdef sequent
  1999. --- 1954,1964 ----
  2000.         break;
  2001.   
  2002.       case N_INDR:
  2003. !       reftype = (char *) alloca (23
  2004. !                      + strlen ((nlist_p + 1)->n_un.n_strx
  2005. !                            + entry->strings));
  2006.         sprintf (reftype, "defined equivalent to %s",
  2007. !            (nlist_p + 1)->n_un.n_strx + entry->strings);
  2008.         break;
  2009.   
  2010.   #ifdef sequent
  2011. ***************
  2012. *** 2346,2356 ****
  2013.         reftype = "shared BSS";
  2014.         break;
  2015.   */
  2016. - #endif
  2017.       default:
  2018.         reftype = "I don't know this type";
  2019.         break;
  2020.       }
  2021.   
  2022.         fprintf (stderr, "symbol %s %s in ", sp->name, reftype);
  2023. --- 1975,1984 ----
  2024.         reftype = "shared BSS";
  2025.         break;
  2026.   */
  2027.       default:
  2028.         reftype = "I don't know this type";
  2029.         break;
  2030. + #endif
  2031.       }
  2032.   
  2033.         fprintf (stderr, "symbol %s %s in ", sp->name, reftype);
  2034. ***************
  2035. *** 2370,2376 ****
  2036.   {
  2037.     if (n_ptr >= entry->symbols &&
  2038.         n_ptr < (entry->symbols
  2039. !            + (entry->syms_size / sizeof (struct nlist))))
  2040.       return (unsigned long) entry;
  2041.     return 0;
  2042.   }
  2043. --- 1998,2004 ----
  2044.   {
  2045.     if (n_ptr >= entry->symbols &&
  2046.         n_ptr < (entry->symbols
  2047. !            + (entry->header.a_syms / sizeof (struct nlist))))
  2048.       return (unsigned long) entry;
  2049.     return 0;
  2050.   }
  2051. ***************
  2052. *** 2577,2583 ****
  2053.                + symdef_base[i].symbol_name_string_index,
  2054.                entry->filename);
  2055.           read_entry_symbols (desc, subentry);
  2056. !         subentry->strings = xmalloc (subentry->strs_size);
  2057.           read_entry_strings (desc, subentry);
  2058.   
  2059.           /* Now scan the symbol table and decide whether to load.  */
  2060. --- 2205,2211 ----
  2061.                + symdef_base[i].symbol_name_string_index,
  2062.                entry->filename);
  2063.           read_entry_symbols (desc, subentry);
  2064. !         subentry->strings = (char *) malloc (subentry->string_size);
  2065.           read_entry_strings (desc, subentry);
  2066.   
  2067.           /* Now scan the symbol table and decide whether to load.  */
  2068. ***************
  2069. *** 2585,2591 ****
  2070.           if (!subfile_wanted_p (subentry))
  2071.             {
  2072.               free (subentry->symbols);
  2073. -             free (subentry->strings);
  2074.               free (subentry);
  2075.             }
  2076.           else
  2077. --- 2213,2218 ----
  2078. ***************
  2079. *** 2611,2621 ****
  2080.               if (symdef_base[j].library_member_offset == offset)
  2081.                 symdef_base[j].symbol_name_string_index = -1;
  2082.                 }
  2083. -             /* We'll read the strings again if we need them again.  */
  2084. -             free (subentry->strings);
  2085. -             subentry->strings = 0;
  2086.             }
  2087.             }
  2088.         }
  2089.       }
  2090. --- 2238,2248 ----
  2091.               if (symdef_base[j].library_member_offset == offset)
  2092.                 symdef_base[j].symbol_name_string_index = -1;
  2093.                 }
  2094.             }
  2095. +         /* We'll read the strings again if we need them again.  */
  2096. +         free (subentry->strings);
  2097. +         subentry->strings = 0;
  2098.             }
  2099.         }
  2100.       }
  2101. ***************
  2102. *** 2631,2638 ****
  2103.        register struct file_entry *subentry;
  2104.        struct file_entry **prev_addr, *entry;
  2105.   {
  2106.     read_entry_symbols (desc, subentry);
  2107. !   subentry->strings = (char *) alloca (subentry->strs_size);
  2108.     read_entry_strings (desc, subentry);
  2109.   
  2110.     if (!subfile_wanted_p (subentry))
  2111. --- 2258,2267 ----
  2112.        register struct file_entry *subentry;
  2113.        struct file_entry **prev_addr, *entry;
  2114.   {
  2115. +   register struct file_entry *prev = *prev_addr;
  2116.     read_entry_symbols (desc, subentry);
  2117. !   subentry->strings = (char *) alloca (subentry->string_size);
  2118.     read_entry_strings (desc, subentry);
  2119.   
  2120.     if (!subfile_wanted_p (subentry))
  2121. ***************
  2122. *** 2644,2654 ****
  2123.       {
  2124.         enter_file_symbols (subentry);
  2125.   
  2126. !       if (*prev_addr)
  2127. !     (*prev_addr)->chain = subentry;
  2128.         else
  2129.       entry->subfiles = subentry;
  2130. !       *prev_addr = subentry;
  2131.         subentry->strings = 0; /* Since space will dissapear on return */
  2132.       }
  2133.   }
  2134. --- 2273,2283 ----
  2135.       {
  2136.         enter_file_symbols (subentry);
  2137.   
  2138. !       if (prev)
  2139. !     prev->chain = subentry;
  2140.         else
  2141.       entry->subfiles = subentry;
  2142. !       prev = subentry;
  2143.         subentry->strings = 0; /* Since space will dissapear on return */
  2144.       }
  2145.   }
  2146. ***************
  2147. *** 2690,2696 ****
  2148.   {
  2149.     register struct nlist *p;
  2150.     register struct nlist *end
  2151. !     = entry->symbols + entry->syms_size / sizeof (struct nlist);
  2152.   #ifdef DOLLAR_KLUDGE
  2153.     register int dollar_cond = 0;
  2154.   #endif
  2155. --- 2319,2325 ----
  2156.   {
  2157.     register struct nlist *p;
  2158.     register struct nlist *end
  2159. !     = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  2160.   #ifdef DOLLAR_KLUDGE
  2161.     register int dollar_cond = 0;
  2162.   #endif
  2163. ***************
  2164. *** 2704,2710 ****
  2165.        potentially want it.  */
  2166.         if (type & N_EXT
  2167.         && (type != (N_UNDF | N_EXT) || p->n_value
  2168.   #ifdef DOLLAR_KLUDGE
  2169.              || name[1] == '$'
  2170.   #endif
  2171. --- 2333,2339 ----
  2172.        potentially want it.  */
  2173.         if (type & N_EXT
  2174.         && (type != (N_UNDF | N_EXT) || p->n_value
  2175. !           
  2176.   #ifdef DOLLAR_KLUDGE
  2177.              || name[1] == '$'
  2178.   #endif
  2179. ***************
  2180. *** 2738,2745 ****
  2181.         if (!sp) continue;
  2182.   
  2183.         if ((sp->referenced && !sp->defined)
  2184. -           /* NB.  This needs to be changed so that, e.g., "int pipe;" won't import
  2185. -          pipe() from the library.  But the bug fix kingdon made was wrong.  */
  2186.             || (sp->defined && sp->max_common_size))
  2187.           {
  2188.             /* This is a symbol we are looking for.  It is either
  2189. --- 2367,2372 ----
  2190. ***************
  2191. *** 2796,2807 ****
  2192.     if (trace_files)
  2193.       fprintf (stderr, "Digesting symbol information:\n\n");
  2194.   
  2195. -   /* Initialize the text_start address; this depends on the output file formats.  */
  2196. -   initialize_text_start ();
  2197. -   text_size = text_header_size;
  2198.     /* Compute total size of sections */
  2199.   
  2200.     each_file (consider_file_section_lengths, 0);
  2201. --- 2423,2428 ----
  2202. ***************
  2203. *** 2809,2836 ****
  2204.     /* If necessary, pad text section to full page in the file.
  2205.        Include the padding in the text segment size.  */
  2206.   
  2207. !   if (output_style == OUTPUT_READONLY_TEXT || output_style == OUTPUT_DEMAND_PAGED)
  2208.       {
  2209. !       text_pad = ((text_size + page_size - 1) & (- page_size)) - text_size;
  2210.         text_size += text_pad;
  2211.       }
  2212.   
  2213. !   /* Now that the text_size is known, initialize the data start address;
  2214. !      this depends on text_size as well as the output file format.  */
  2215.   
  2216. !   initialize_data_start ();
  2217.   
  2218.     /* Make sure bss starts out aligned as much as anyone can want.  */
  2219. -   {
  2220. -     int new_data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2221.   
  2222. !     data_pad += new_data_size - data_size;
  2223. !     data_size = new_data_size;
  2224. !   }
  2225.   
  2226.     /* Set up the set element vector */
  2227.   
  2228. !   if (output_style != OUTPUT_RELOCATABLE)
  2229.       {
  2230.         /* The set sector size is the number of set elements + a word
  2231.            for each symbol for the length word at the beginning of the
  2232. --- 2430,2463 ----
  2233.     /* If necessary, pad text section to full page in the file.
  2234.        Include the padding in the text segment size.  */
  2235.   
  2236. ! #ifdef NMAGIC
  2237. !   if (magic == ZMAGIC || magic == NMAGIC)
  2238. ! #else
  2239. !   if (magic == ZMAGIC)
  2240. ! #endif
  2241.       {
  2242. !       int text_end = text_size + N_TXTOFF (outheader);
  2243. !       text_pad = ((text_end + page_size - 1) & (- page_size)) - text_end;
  2244.         text_size += text_pad;
  2245.       }
  2246.   
  2247. !   outheader.a_text = text_size;
  2248. ! #ifdef sequent
  2249. !   outheader.a_text += N_ADDRADJ (outheader);
  2250. ! #endif
  2251. !   /* Make the data segment address start in memory on a suitable boundary.  */
  2252.   
  2253. !   if (! Tdata_flag_specified)
  2254. !     data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  2255.   
  2256.     /* Make sure bss starts out aligned as much as anyone can want.  */
  2257.   
  2258. !   data_size = (data_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2259.   
  2260.     /* Set up the set element vector */
  2261.   
  2262. !   if (!relocatable_output)
  2263.       {
  2264.         /* The set sector size is the number of set elements + a word
  2265.            for each symbol for the length word at the beginning of the
  2266. ***************
  2267. *** 2866,2872 ****
  2268.       {
  2269.         /* For each symbol */
  2270.         register struct nlist *p, *next;
  2271. !       int defs = 0, com = sp->max_common_size;
  2272.         struct nlist *first_definition;
  2273.         for (p = sp->refs; p; p = next)
  2274.           {
  2275. --- 2493,2499 ----
  2276.       {
  2277.         /* For each symbol */
  2278.         register struct nlist *p, *next;
  2279. !       int defs = 0, com = sp->max_common_size, erred = 0;
  2280.         struct nlist *first_definition;
  2281.         for (p = sp->refs; p; p = next)
  2282.           {
  2283. ***************
  2284. *** 2874,2880 ****
  2285.   
  2286.             if (SET_ELEMENT_P (type))
  2287.           {
  2288. !           if (output_style == OUTPUT_RELOCATABLE)
  2289.               fatal ("internal: global ref to set element with -r");
  2290.             if (!defs++)
  2291.               {
  2292. --- 2501,2507 ----
  2293.   
  2294.             if (SET_ELEMENT_P (type))
  2295.           {
  2296. !           if (relocatable_output)
  2297.               fatal ("internal: global ref to set element with -r");
  2298.             if (!defs++)
  2299.               {
  2300. ***************
  2301. *** 2908,2914 ****
  2302.         /* Allocate as common if defined as common and not defined for real */
  2303.         if (com && !defs)
  2304.           {
  2305. !           if (output_style != OUTPUT_RELOCATABLE || force_common_definition)
  2306.           {
  2307.             int align = sizeof (int);
  2308.   
  2309. --- 2535,2541 ----
  2310.         /* Allocate as common if defined as common and not defined for real */
  2311.         if (com && !defs)
  2312.           {
  2313. !           if (!relocatable_output || force_common_definition)
  2314.           {
  2315.             int align = sizeof (int);
  2316.   
  2317. ***************
  2318. *** 2919,2925 ****
  2319.                this size alignment is ever removed, ALIGN above
  2320.                will have to be initialized to 1 instead of
  2321.                sizeof (int).  */
  2322.             com = (com + sizeof (int) - 1) & (- sizeof (int));
  2323.   
  2324.             while (!(com & align))
  2325. --- 2546,2552 ----
  2326.                this size alignment is ever removed, ALIGN above
  2327.                will have to be initialized to 1 instead of
  2328.                sizeof (int).  */
  2329. !           
  2330.             com = (com + sizeof (int) - 1) & (- sizeof (int));
  2331.   
  2332.             while (!(com & align))
  2333. ***************
  2334. *** 2977,3029 ****
  2335.   
  2336.     bss_size = (bss_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2337.   
  2338. !   /* Give values to _end and friends.  */
  2339. !   {
  2340. !     int end_value = data_start + data_size + bss_size;
  2341. !     if (end_symbol)
  2342. !       end_symbol->value = end_value;
  2343. !     if (end_symbol_alt)
  2344. !       end_symbol_alt->value = end_value;
  2345. !   }
  2346. !   {
  2347. !     int etext_value = text_size + text_start;
  2348. !     if (etext_symbol)
  2349. !       etext_symbol->value = etext_value;
  2350. !     if (etext_symbol_alt)
  2351. !       etext_symbol_alt->value = etext_value;
  2352. !   }
  2353. !   {
  2354. !     int edata_value = data_start + data_size;
  2355. !     if (edata_symbol)
  2356. !       edata_symbol->value = edata_value;
  2357. !     if (edata_symbol_alt)
  2358. !       edata_symbol_alt->value = edata_value;
  2359. !   }
  2360.   
  2361.     /* Figure the data_pad now, so that it overlaps with the bss addresses.  */
  2362.   
  2363. !   {
  2364. !     /* The amount of data_pad that we are computing now.  This is the
  2365. !        part which overlaps with bss.  What was computed previously
  2366. !        goes before bss.  */
  2367. !     int data_pad_additional = 0;
  2368. !     
  2369. !     if (specified_data_size && specified_data_size > data_size)
  2370. !       data_pad_additional = specified_data_size - data_size;
  2371. !     if (output_style == OUTPUT_DEMAND_PAGED)
  2372. !       data_pad_additional =
  2373. !     ((data_pad_additional + data_size + page_size - 1) & (- page_size)) - data_size;
  2374. !     bss_size -= data_pad_additional;
  2375. !     if (bss_size < 0) bss_size = 0;
  2376.   
  2377. !     data_size += data_pad_additional;
  2378.   
  2379. !     data_pad += data_pad_additional;
  2380. !   }
  2381.   }
  2382.   
  2383.   /* Accumulate the section sizes of input file ENTRY
  2384. --- 2604,2629 ----
  2385.   
  2386.     bss_size = (bss_size + sizeof(double) - 1) & ~(sizeof(double)-1);
  2387.   
  2388. !   if (end_symbol)        /* These are null if -r.  */
  2389. !     {
  2390. !       etext_symbol->value = text_size + text_start;
  2391. !       edata_symbol->value = data_start + data_size;
  2392. !       end_symbol->value = data_start + data_size + bss_size;
  2393. !     }
  2394.   
  2395.     /* Figure the data_pad now, so that it overlaps with the bss addresses.  */
  2396.   
  2397. !   if (specified_data_size && specified_data_size > data_size)
  2398. !     data_pad = specified_data_size - data_size;
  2399.   
  2400. !   if (magic == ZMAGIC)
  2401. !     data_pad = ((data_pad + data_size + page_size - 1) & (- page_size))
  2402. !                - data_size;
  2403. !   bss_size -= data_pad;
  2404. !   if (bss_size < 0) bss_size = 0;
  2405.   
  2406. !   data_size += data_pad;
  2407.   }
  2408.   
  2409.   /* Accumulate the section sizes of input file ENTRY
  2410. ***************
  2411. *** 3038,3051 ****
  2412.   
  2413.     entry->text_start_address = text_size;
  2414.     /* If there were any vectors, we need to chop them off */
  2415. !   text_size += entry->text_size;
  2416.     entry->data_start_address = data_size;
  2417. !   data_size += entry->data_size;
  2418.     entry->bss_start_address = bss_size;
  2419. !   bss_size += entry->bss_size;
  2420.   
  2421. !   text_reloc_size += entry->text_reloc_size;
  2422. !   data_reloc_size += entry->data_reloc_size;
  2423.   }
  2424.   
  2425.   /* Determine where the sections of ENTRY go into the output file,
  2426. --- 2638,2651 ----
  2427.   
  2428.     entry->text_start_address = text_size;
  2429.     /* If there were any vectors, we need to chop them off */
  2430. !   text_size += entry->header.a_text;
  2431.     entry->data_start_address = data_size;
  2432. !   data_size += entry->header.a_data;
  2433.     entry->bss_start_address = bss_size;
  2434. !   bss_size += entry->header.a_bss;
  2435.   
  2436. !   text_reloc_size += entry->header.a_trsize;
  2437. !   data_reloc_size += entry->header.a_drsize;
  2438.   }
  2439.   
  2440.   /* Determine where the sections of ENTRY go into the output file,
  2441. ***************
  2442. *** 3057,3066 ****
  2443.        register struct file_entry *entry;
  2444.   {
  2445.     entry->text_start_address += text_start;
  2446. !   /* Note that `data_start' and `data_size' have not yet been adjusted
  2447. !      for the portion of data_pad which overlaps with bss.  If they had
  2448. !      been, we would get the wrong results here.  */
  2449.     entry->data_start_address += data_start;
  2450.     entry->bss_start_address += data_start + data_size;
  2451.   
  2452. --- 2657,2665 ----
  2453.        register struct file_entry *entry;
  2454.   {
  2455.     entry->text_start_address += text_start;
  2456. !   /* Note that `data_start' and `data_size' have not yet been
  2457. !      adjusted for `data_pad'.  If they had been, we would get the wrong
  2458. !      results here.  */
  2459.     entry->data_start_address += data_start;
  2460.     entry->bss_start_address += data_start + data_size;
  2461.   
  2462. ***************
  2463. *** 3067,3098 ****
  2464.     {
  2465.       register struct nlist *p;
  2466.       register struct nlist *end
  2467. !       = entry->symbols + entry->syms_size / sizeof (struct nlist);
  2468.   
  2469.       for (p = entry->symbols; p < end; p++)
  2470.         {
  2471.       /* If this belongs to a section, update it by the section's start address */
  2472. !     register int type = p->n_type & ~N_EXT;
  2473.   
  2474.       switch (type)
  2475.         {
  2476.         case N_TEXT:
  2477.         case N_SETT:
  2478. !         p->n_value += entry->text_start_address - entry->orig_text_address;
  2479.           break;
  2480.         case N_DATA:
  2481.         case N_SETV:
  2482.         case N_SETD:
  2483. !         /* Data segment symbol.  Subtract the address of the
  2484. !            data segment in the input file, and add the address
  2485. !            of this input file's data segment in the output file.  */
  2486. !         p->n_value +=
  2487. !           entry->data_start_address - entry->orig_data_address;
  2488.           break;
  2489.         case N_BSS:
  2490.         case N_SETB:
  2491.           /* likewise for symbols with value in BSS.  */
  2492. !         p->n_value += entry->bss_start_address - entry->orig_bss_address;
  2493.           break;
  2494.         }
  2495.         }
  2496. --- 2666,2697 ----
  2497.     {
  2498.       register struct nlist *p;
  2499.       register struct nlist *end
  2500. !       = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  2501.   
  2502.       for (p = entry->symbols; p < end; p++)
  2503.         {
  2504.       /* If this belongs to a section, update it by the section's start address */
  2505. !     register int type = p->n_type & N_TYPE;
  2506.   
  2507.       switch (type)
  2508.         {
  2509.         case N_TEXT:
  2510.         case N_SETT:
  2511. !         p->n_value += entry->text_start_address;
  2512.           break;
  2513.         case N_DATA:
  2514.         case N_SETV:
  2515.         case N_SETD:
  2516. !         /* A symbol whose value is in the data section
  2517. !            is present in the input file as if the data section
  2518. !            started at an address equal to the length of the file's text.  */
  2519. !         p->n_value += entry->data_start_address - entry->header.a_text;
  2520.           break;
  2521.         case N_BSS:
  2522.         case N_SETB:
  2523.           /* likewise for symbols with value in BSS.  */
  2524. !         p->n_value += entry->bss_start_address
  2525. !           - entry->header.a_text - entry->header.a_data;
  2526.           break;
  2527.         }
  2528.         }
  2529. ***************
  2530. *** 3143,3151 ****
  2531.       fprintf (outfile, " symbols only\n", 0);
  2532.     else
  2533.       fprintf (outfile, " text %x(%x), data %x(%x), bss %x(%x) hex\n",
  2534. !          entry->text_start_address, entry->text_size,
  2535. !          entry->data_start_address, entry->data_size,
  2536. !          entry->bss_start_address, entry->bss_size);
  2537.   }
  2538.   
  2539.   void
  2540. --- 2742,2750 ----
  2541.       fprintf (outfile, " symbols only\n", 0);
  2542.     else
  2543.       fprintf (outfile, " text %x(%x), data %x(%x), bss %x(%x) hex\n",
  2544. !          entry->text_start_address, entry->header.a_text,
  2545. !          entry->data_start_address, entry->header.a_data,
  2546. !          entry->bss_start_address, entry->header.a_bss);
  2547.   }
  2548.   
  2549.   void
  2550. ***************
  2551. *** 3155,3163 ****
  2552.   {
  2553.     register struct nlist
  2554.       *p,
  2555. !     *end = entry->symbols + entry->syms_size / sizeof (struct nlist);
  2556.   
  2557. !   entry->strings = (char *) alloca (entry->strs_size);
  2558.     read_entry_strings (file_open (entry), entry);
  2559.   
  2560.     fprintf (outfile, "\nLocal symbols of ");
  2561. --- 2754,2762 ----
  2562.   {
  2563.     register struct nlist
  2564.       *p,
  2565. !     *end = entry->symbols + entry->header.a_syms / sizeof (struct nlist);
  2566.   
  2567. !   entry->strings = (char *) alloca (entry->string_size);
  2568.     read_entry_strings (file_open (entry), entry);
  2569.   
  2570.     fprintf (outfile, "\nLocal symbols of ");
  2571. ***************
  2572. *** 3232,3243 ****
  2573.     current->filename = next->filename;
  2574.   
  2575.     while (++(next->sym) < (entry->symbols
  2576. !               + entry->syms_size/sizeof (struct nlist)))
  2577.       {
  2578.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  2579.          * may look negative...therefore, must mask to low bits
  2580.          */
  2581. !       switch (next->sym->n_type & 0xff)
  2582.       {
  2583.       case N_SLINE:
  2584.         if (use_data_symbols) continue;
  2585. --- 2831,2842 ----
  2586.     current->filename = next->filename;
  2587.   
  2588.     while (++(next->sym) < (entry->symbols
  2589. !               + entry->header.a_syms/sizeof (struct nlist)))
  2590.       {
  2591.         /* n_type is a char, and N_SOL, N_EINCL and N_BINCL are > 0x80, so
  2592.          * may look negative...therefore, must mask to low bits
  2593.          */
  2594. !       switch (next->sym->n_type & 0xff) 
  2595.       {
  2596.       case N_SLINE:
  2597.         if (use_data_symbols) continue;
  2598. ***************
  2599. *** 3292,3304 ****
  2600.   
  2601.     for (tmp = entry->symbols;
  2602.          tmp < (entry->symbols
  2603. !           + entry->syms_size/sizeof (struct nlist));
  2604.          tmp++)
  2605.       if (tmp->n_type == (int) N_SO)
  2606.         break;
  2607.   
  2608.     if (tmp >= (entry->symbols
  2609. !           + entry->syms_size/sizeof (struct nlist)))
  2610.       {
  2611.         /* I believe this translates to "We lose" */
  2612.         current->filename = next->filename = entry->filename;
  2613. --- 2891,2903 ----
  2614.   
  2615.     for (tmp = entry->symbols;
  2616.          tmp < (entry->symbols
  2617. !           + entry->header.a_syms/sizeof (struct nlist));
  2618.          tmp++)
  2619.       if (tmp->n_type == (int) N_SO)
  2620.         break;
  2621.   
  2622.     if (tmp >= (entry->symbols
  2623. !           + entry->header.a_syms/sizeof (struct nlist)))
  2624.       {
  2625.         /* I believe this translates to "We lose" */
  2626.         current->filename = next->filename = entry->filename;
  2627. ***************
  2628. *** 3341,3347 ****
  2629.      which describes the current location in the implied scan through
  2630.      the debug symbols within the file which ADDRESS is within, and
  2631.      returns the source line number which corresponds to ADDRESS.  */
  2632.   int
  2633.   address_to_line (address, state_pointer)
  2634.        unsigned long address;
  2635. --- 2940,2946 ----
  2636.      which describes the current location in the implied scan through
  2637.      the debug symbols within the file which ADDRESS is within, and
  2638.      returns the source line number which corresponds to ADDRESS.  */
  2639. !   
  2640.   int
  2641.   address_to_line (address, state_pointer)
  2642.        unsigned long address;
  2643. ***************
  2644. *** 3356,3362 ****
  2645.     int use_data_symbols;
  2646.   
  2647.     if (next->sym)
  2648. !     use_data_symbols = (next->sym->n_type & ~N_EXT) == N_DATA;
  2649.     else
  2650.       return current->line;
  2651.   
  2652. --- 2955,2961 ----
  2653.     int use_data_symbols;
  2654.   
  2655.     if (next->sym)
  2656. !     use_data_symbols = (next->sym->n_type & N_TYPE) == N_DATA;
  2657.     else
  2658.       return current->line;
  2659.   
  2660. ***************
  2661. *** 3408,3414 ****
  2662.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  2663.       *reloc;
  2664.     int reloc_size
  2665. !     = ((data_segment ? entry->data_reloc_size : entry->text_reloc_size)
  2666.          / sizeof (struct relocation_info));
  2667.     int start_of_segment
  2668.       = (data_segment ? entry->data_start_address : entry->text_start_address);
  2669. --- 3007,3013 ----
  2670.       *reloc_start = data_segment ? entry->datarel : entry->textrel,
  2671.       *reloc;
  2672.     int reloc_size
  2673. !     = ((data_segment ? entry->header.a_drsize : entry->header.a_trsize)
  2674.          / sizeof (struct relocation_info));
  2675.     int start_of_segment
  2676.       = (data_segment ? entry->data_start_address : entry->text_start_address);
  2677. ***************
  2678. *** 3415,3421 ****
  2679.     struct nlist *start_of_syms = entry->symbols;
  2680.     struct line_debug_entry *state_pointer
  2681.       = init_debug_scan (data_segment != 0, entry);
  2682. !   register struct line_debug_entry *current = state_pointer;
  2683.     /* Assigned to generally static values; should not be written into.  */
  2684.     char *errfmt;
  2685.     /* Assigned to alloca'd values cand copied into; should be freed
  2686. --- 3014,3023 ----
  2687.     struct nlist *start_of_syms = entry->symbols;
  2688.     struct line_debug_entry *state_pointer
  2689.       = init_debug_scan (data_segment != 0, entry);
  2690. !   register struct line_debug_entry
  2691. !     *current = state_pointer,
  2692. !     *next = state_pointer + 1,
  2693. !     *source = state_pointer + 2;
  2694.     /* Assigned to generally static values; should not be written into.  */
  2695.     char *errfmt;
  2696.     /* Assigned to alloca'd values cand copied into; should be freed
  2697. ***************
  2698. *** 3459,3465 ****
  2699.       {
  2700.         /* Mark as being noted by relocation warning pass.  */
  2701.         SET_BIT (nlist_bitvector, s - start_of_syms);
  2702.         if (g->undef_refs >= MAX_UREFS_PRINTED)    /* Listed too many */
  2703.           continue;
  2704.   
  2705. --- 3061,3067 ----
  2706.       {
  2707.         /* Mark as being noted by relocation warning pass.  */
  2708.         SET_BIT (nlist_bitvector, s - start_of_syms);
  2709. !       
  2710.         if (g->undef_refs >= MAX_UREFS_PRINTED)    /* Listed too many */
  2711.           continue;
  2712.   
  2713. ***************
  2714. *** 3483,3506 ****
  2715.   
  2716.         /* Mark as being noted by relocation warning pass.  */
  2717.         SET_BIT (nlist_bitvector, s - start_of_syms);
  2718.         errfmt = 0;
  2719.         errmsg = g->warning;
  2720.         invalidate_line_number = 0;
  2721.       }
  2722.   
  2723.         /* If errfmt == 0, errmsg has already been defined.  */
  2724.         if (errfmt != 0)
  2725.       {
  2726. !       char *nm;
  2727. !       if (!demangler || !(nm = (*demangler)(g->name)))
  2728. !         nm = g->name;
  2729. !       errmsg = xmalloc (strlen (errfmt) + strlen (nm) + 1);
  2730. !       sprintf (errmsg, errfmt, nm, data_segment ? "data" : "text");
  2731. !       if (nm != g->name)
  2732. !         free (nm);
  2733.       }
  2734.   
  2735.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  2736. --- 3085,3102 ----
  2737.   
  2738.         /* Mark as being noted by relocation warning pass.  */
  2739.         SET_BIT (nlist_bitvector, s - start_of_syms);
  2740. !       
  2741.         errfmt = 0;
  2742.         errmsg = g->warning;
  2743.         invalidate_line_number = 0;
  2744.       }
  2745. !       
  2746.   
  2747.         /* If errfmt == 0, errmsg has already been defined.  */
  2748.         if (errfmt != 0)
  2749.       {
  2750. !       errmsg = (char *) xmalloc (strlen (errfmt) + strlen (g->name) + 1);
  2751. !       sprintf (errmsg, errfmt, g->name, data_segment ? "data" : "text");
  2752.       }
  2753.   
  2754.         address_to_line (RELOC_ADDRESS (reloc) + start_of_segment,
  2755. ***************
  2756. *** 3507,3523 ****
  2757.                  state_pointer);
  2758.   
  2759.         if (current->line >=0)
  2760. !     {
  2761. !       fprintf (outfile, "%s:%d (", current->filename,
  2762. !            invalidate_line_number ? 0 : current->line);
  2763. !       print_file_name (entry, outfile);
  2764. !       fprintf (outfile, "): %s\n", errmsg);
  2765. !     }
  2766. !       else
  2767. !     {
  2768. !       print_file_name(entry, outfile);
  2769. !       fprintf(outfile, ": %s\n", errmsg);
  2770. !     }
  2771.   
  2772.         if (errfmt != 0)
  2773.       free (errmsg);
  2774. --- 3103,3112 ----
  2775.                  state_pointer);
  2776.   
  2777.         if (current->line >=0)
  2778. !     fprintf (outfile, "%s:%d: %s\n", current->filename,
  2779. !          invalidate_line_number ? 0 : current->line, errmsg);
  2780. !       else
  2781. !     fprintf (outfile, "%s: %s\n", current->filename, errmsg);
  2782.   
  2783.         if (errfmt != 0)
  2784.       free (errmsg);
  2785. ***************
  2786. *** 3535,3541 ****
  2787.        struct file_entry *entry;
  2788.        FILE *outfile;
  2789.   {
  2790. !   int number_of_syms = entry->syms_size / sizeof (struct nlist);
  2791.     unsigned char *nlist_bitvector
  2792.       = (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  2793.     struct line_debug_entry *text_scan, *data_scan;
  2794. --- 3124,3130 ----
  2795.        struct file_entry *entry;
  2796.        FILE *outfile;
  2797.   {
  2798. !   int number_of_syms = entry->header.a_syms / sizeof (struct nlist);
  2799.     unsigned char *nlist_bitvector
  2800.       = (unsigned char *) alloca ((number_of_syms >> 3) + 1);
  2801.     struct line_debug_entry *text_scan, *data_scan;
  2802. ***************
  2803. *** 3551,3557 ****
  2804.       {
  2805.         int desc;
  2806.   
  2807. !       entry->strings = (char *) alloca (entry->strs_size);
  2808.         desc = file_open (entry);
  2809.         read_entry_strings (desc, entry);
  2810.       }
  2811. --- 3140,3146 ----
  2812.       {
  2813.         int desc;
  2814.   
  2815. !       entry->strings = (char *) alloca (entry->string_size);
  2816.         desc = file_open (entry);
  2817.         read_entry_strings (desc, entry);
  2818.       }
  2819. ***************
  2820. *** 3615,3621 ****
  2821.       {
  2822.         if (g->undef_refs >= MAX_UREFS_PRINTED)
  2823.           continue;
  2824.         if (++(g->undef_refs) == MAX_UREFS_PRINTED)
  2825.           errfmt = "More undefined \"%s\" refs follow";
  2826.         else
  2827. --- 3204,3210 ----
  2828.       {
  2829.         if (g->undef_refs >= MAX_UREFS_PRINTED)
  2830.           continue;
  2831. !       
  2832.         if (++(g->undef_refs) == MAX_UREFS_PRINTED)
  2833.           errfmt = "More undefined \"%s\" refs follow";
  2834.         else
  2835. ***************
  2836. *** 3638,3670 ****
  2837.       }
  2838.         else
  2839.       continue;
  2840.         if (line_number == -1)
  2841. !     {
  2842. !       print_file_name (entry, outfile);
  2843. !       fprintf (outfile, ": ");
  2844. !     }
  2845.         else
  2846. !     {
  2847. !       fprintf (outfile, "%s:%d (", file_name, line_number);
  2848. !       print_file_name (entry, outfile);
  2849. !       fprintf (outfile, "): ");
  2850. !     }
  2851.   
  2852.         if (dont_allow_symbol_name)
  2853.       fprintf (outfile, "%s", errfmt);
  2854.         else
  2855. !     {
  2856. !       char *nm;
  2857. !       if (!demangler || !(nm = (*demangler)(g->name)))
  2858. !         fprintf (outfile, errfmt, g->name);
  2859. !       else
  2860. !         {
  2861. !           fprintf (outfile, errfmt, nm);
  2862. !           free (nm);
  2863. !         }
  2864. !     }
  2865.   
  2866.         fputc ('\n', outfile);
  2867.       }
  2868. --- 3227,3242 ----
  2869.       }
  2870.         else
  2871.       continue;
  2872. !       
  2873.         if (line_number == -1)
  2874. !     fprintf (outfile, "%s: ", entry->filename);
  2875.         else
  2876. !     fprintf (outfile, "%s:%d: ", file_name, line_number);
  2877.   
  2878.         if (dont_allow_symbol_name)
  2879.       fprintf (outfile, "%s", errfmt);
  2880.         else
  2881. !     fprintf (outfile, errfmt, g->name);
  2882.   
  2883.         fputc ('\n', outfile);
  2884.       }
  2885. ***************
  2886. *** 3676,3682 ****
  2887.   do_warnings (outfile)
  2888.        FILE *outfile;
  2889.   {
  2890. !   list_unresolved_refs = output_style != OUTPUT_RELOCATABLE && undefined_global_sym_count;
  2891.     list_warning_symbols = warning_count;
  2892.     list_multiple_defs = multiple_def_count != 0;
  2893.   
  2894. --- 3248,3256 ----
  2895.   do_warnings (outfile)
  2896.        FILE *outfile;
  2897.   {
  2898. !   int i;
  2899. !   list_unresolved_refs = !relocatable_output && undefined_global_sym_count;
  2900.     list_warning_symbols = warning_count;
  2901.     list_multiple_defs = multiple_def_count != 0;
  2902.   
  2903. ***************
  2904. *** 3692,3795 ****
  2905.       make_executable = 0;
  2906.   }
  2907.   
  2908. ! #ifdef A_OUT
  2909.   
  2910. ! /* Stuff pertaining to creating a.out files. */
  2911.   
  2912. ! /* The a.out header. */
  2913.   
  2914. ! struct exec outheader;
  2915.   
  2916. ! #ifdef COFF_ENCAPSULATE
  2917. ! int need_coff_header;
  2918. ! struct coffheader coffheader;
  2919. ! #endif
  2920.   
  2921. ! /* Compute text_start and text_header_size for an a.out file.  */
  2922.   
  2923. ! void
  2924. ! initialize_a_out_text_start ()
  2925. ! {
  2926. !   int magic;
  2927.   
  2928. !   switch (output_style)
  2929. !     {
  2930. !     case OUTPUT_RELOCATABLE:
  2931. !     case OUTPUT_WRITABLE_TEXT:
  2932. !       magic = OMAGIC;
  2933. !       break;
  2934. !     case OUTPUT_READONLY_TEXT:
  2935. ! #ifdef NMAGIC
  2936. !       magic = NMAGIC;
  2937. !       break;
  2938. ! #endif
  2939. !     case OUTPUT_DEMAND_PAGED:
  2940. !       magic = ZMAGIC;
  2941. !       break;
  2942. !     default:
  2943. !       fatal ("unknown output style found (bug in ld)", (char *) 0);
  2944. !       break;
  2945. !     }
  2946.   
  2947. !   /* Determine whether to count the header as part of
  2948. !      the text size, and initialize the text size accordingly.
  2949. !      This depends on the kind of system and on the output format selected.  */
  2950. !   N_SET_MAGIC (outheader, magic);
  2951. ! #ifdef INITIALIZE_HEADER
  2952. !   INITIALIZE_HEADER;
  2953. ! #endif
  2954.   
  2955. !   text_header_size = sizeof (struct exec);
  2956. ! #ifdef COFF_ENCAPSULATE
  2957. !   /* Don't write the coff header for the output of ld -A (since
  2958. !      it is not executable by the kernel anyway).  */
  2959. !   if (output_style != OUTPUT_RELOCATABLE && !file_table[0].just_syms_flag)
  2960. !     {
  2961. !       need_coff_header = 1;
  2962. !       /* set this flag now, since it will change the values of N_TXTOFF, etc */
  2963. !       N_SET_FLAGS (outheader, N_FLAGS_COFF_ENCAPSULATE);
  2964. !       text_header_size += sizeof (struct coffheader);
  2965. !     }
  2966. ! #endif
  2967. !   if (text_header_size <= N_TXTOFF (outheader))
  2968. !     text_header_size = 0;
  2969. !   else
  2970. !     text_header_size -= N_TXTOFF (outheader);
  2971. ! #ifdef _N_BASEADDR
  2972. !   /* SunOS 4.1 N_TXTADDR depends on the value of outheader.a_entry. */
  2973. !   outheader.a_entry = N_PAGSIZ(outheader);
  2974. ! #endif
  2975.   
  2976. !   if (!T_flag_specified && output_style != OUTPUT_RELOCATABLE)
  2977. !     text_start = N_TXTADDR (outheader);
  2978. ! }
  2979.   
  2980. ! /* Compute data_start once text_size is known. */
  2981.   
  2982.   void
  2983. ! initialize_a_out_data_start ()
  2984.   {
  2985.     outheader.a_text = text_size;
  2986.   #ifdef sequent
  2987.     outheader.a_text += N_ADDRADJ (outheader);
  2988. -   if (entry_symbol == 0)
  2989. -     entry_symbol = getsym ("start");
  2990.   #endif
  2991. -   if (! Tdata_flag_specified)
  2992. -     data_start = N_DATADDR (outheader) + text_start - N_TXTADDR (outheader);
  2993. - }
  2994. - /* Compute offsets of various pieces of the a.out output file.  */
  2995. - void
  2996. - compute_a_out_section_offsets ()
  2997. - {
  2998.     outheader.a_data = data_size;
  2999.     outheader.a_bss = bss_size;
  3000.     outheader.a_entry = (entry_symbol ? entry_symbol->value
  3001. !                : text_start + text_header_size);
  3002.   #ifdef COFF_ENCAPSULATE
  3003.     if (need_coff_header)
  3004.       {
  3005. --- 3266,3326 ----
  3006.       make_executable = 0;
  3007.   }
  3008.   
  3009. ! /* Write the output file */
  3010. ! void
  3011. ! write_output ()
  3012. ! {
  3013. !   struct stat statbuf;
  3014. !   int filemode;
  3015.   
  3016. !   outdesc = open (output_filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  3017. !   if (outdesc < 0) perror_name (output_filename);
  3018.   
  3019. !   if (fstat (outdesc, &statbuf) < 0)
  3020. !     perror_name (output_filename);
  3021.   
  3022. !   filemode = statbuf.st_mode;
  3023.   
  3024. !   chmod (output_filename, filemode & ~0111);
  3025.   
  3026. !   /* Output the a.out header.  */
  3027. !   write_header ();
  3028.   
  3029. !   /* Output the text and data segments, relocating as we go.  */
  3030. !   write_text ();
  3031. !   write_data ();
  3032.   
  3033. !   /* Output the merged relocation info, if requested with `-r'.  */
  3034. !   if (relocatable_output)
  3035. !     write_rel ();
  3036.   
  3037. !   /* Output the symbol table (both globals and locals).  */
  3038. !   write_syms ();
  3039.   
  3040. !   /* Copy any GDB symbol segments from input files.  */
  3041. !   write_symsegs ();
  3042.   
  3043. !   close (outdesc);
  3044.   
  3045. !   if (chmod (output_filename, filemode | 0111) == -1)
  3046. !     perror_name (output_filename);
  3047. ! }
  3048. ! void modify_location (), perform_relocation (), copy_text (), copy_data ();
  3049.   
  3050.   void
  3051. ! write_header ()
  3052.   {
  3053. +   N_SET_MAGIC (outheader, magic);
  3054.     outheader.a_text = text_size;
  3055.   #ifdef sequent
  3056.     outheader.a_text += N_ADDRADJ (outheader);
  3057.   #endif
  3058.     outheader.a_data = data_size;
  3059.     outheader.a_bss = bss_size;
  3060.     outheader.a_entry = (entry_symbol ? entry_symbol->value
  3061. !                : text_start + entry_offset);
  3062.   #ifdef COFF_ENCAPSULATE
  3063.     if (need_coff_header)
  3064.       {
  3065. ***************
  3066. *** 3853,3858 ****
  3067. --- 3384,3393 ----
  3068.       }
  3069.   #endif
  3070.   
  3071. + #ifdef INITIALIZE_HEADER
  3072. +   INITIALIZE_HEADER;
  3073. + #endif
  3074.     if (strip_symbols == STRIP_ALL)
  3075.       nsyms = 0;
  3076.     else
  3077. ***************
  3078. *** 3864,3875 ****
  3079.         else if (discard_locals == DISCARD_NONE)
  3080.       nsyms += local_sym_count;
  3081.         /* One extra for following reference on indirects */
  3082. !       if (output_style == OUTPUT_RELOCATABLE)
  3083. ! #ifndef NeXT
  3084.       nsyms += set_symbol_count + global_indirect_count;
  3085. - #else
  3086. -         nsyms += set_symbol_count;
  3087. - #endif
  3088.       }
  3089.   
  3090.     if (strip_symbols == STRIP_NONE)
  3091. --- 3399,3406 ----
  3092.         else if (discard_locals == DISCARD_NONE)
  3093.       nsyms += local_sym_count;
  3094.         /* One extra for following reference on indirects */
  3095. !       if (relocatable_output)
  3096.       nsyms += set_symbol_count + global_indirect_count;
  3097.       }
  3098.   
  3099.     if (strip_symbols == STRIP_NONE)
  3100. ***************
  3101. *** 3877,3883 ****
  3102.   
  3103.     outheader.a_syms = nsyms * sizeof (struct nlist);
  3104.   
  3105. !   if (output_style == OUTPUT_RELOCATABLE)
  3106.       {
  3107.         outheader.a_trsize = text_reloc_size;
  3108.         outheader.a_drsize = data_reloc_size;
  3109. --- 3408,3414 ----
  3110.   
  3111.     outheader.a_syms = nsyms * sizeof (struct nlist);
  3112.   
  3113. !   if (relocatable_output)
  3114.       {
  3115.         outheader.a_trsize = text_reloc_size;
  3116.         outheader.a_drsize = data_reloc_size;
  3117. ***************
  3118. *** 3888,3935 ****
  3119.         outheader.a_drsize = 0;
  3120.       }
  3121.   
  3122. -   /* Initialize the various file offsets.  */
  3123. -   output_text_offset = N_TXTOFF (outheader);
  3124. - #ifdef N_DATOFF
  3125. -   output_data_offset = N_DATOFF (outheader);
  3126. - #else
  3127. -   output_data_offset = output_text_offset + text_size;
  3128. - #endif
  3129. - #ifdef N_TRELOFF
  3130. -   output_trel_offset = N_TRELOFF (outheader);
  3131. - #else
  3132. -   output_trel_offset = output_data_offset + data_size;
  3133. - #endif
  3134. - #ifdef N_DRELOFF
  3135. -   output_drel_offset = N_DRELOFF (outheader);
  3136. - #else
  3137. -   output_drel_offset = output_trel_offset + text_reloc_size;
  3138. - #endif
  3139. -   output_syms_offset = N_SYMOFF (outheader);
  3140. -   output_strs_offset = N_STROFF (outheader);
  3141. - }
  3142. - /* Compute more section offsets once the size of the string table is known.  */
  3143. - void
  3144. - compute_more_a_out_section_offsets ()
  3145. - {
  3146. -   output_symseg_offset = output_strs_offset + output_strs_size;
  3147. - }
  3148. - /* Write the a.out header once everything else is known.  */
  3149. - void
  3150. - write_a_out_header ()
  3151. - {
  3152. -   lseek (outdesc, 0L, 0);
  3153.   #ifdef COFF_ENCAPSULATE
  3154.     if (need_coff_header)
  3155.       mywrite (&coffheader, sizeof coffheader, 1, outdesc);
  3156.   #endif
  3157.     mywrite (&outheader, sizeof (struct exec), 1, outdesc);
  3158.   
  3159.     /* Output whatever padding is required in the executable file
  3160. --- 3419,3428 ----
  3161. ***************
  3162. *** 3939,4570 ****
  3163.     padfile (N_TXTOFF (outheader) - sizeof outheader, outdesc);
  3164.   #endif
  3165.   }
  3166. - #endif
  3167. - #ifdef MACH_O
  3168. - /* Stuff pertaining to creating Mach-O files. */
  3169. - /* Convert the Mach-O style n_sect references into something the rest
  3170. -    of the loader can understand.  */
  3171. - void
  3172. - translate_mach_o_symbols (entry)
  3173. -      struct file_entry *entry;
  3174. - {
  3175. -   int i, n, g;
  3176. -   struct nlist *sym;
  3177. -   n = entry->syms_size / sizeof (struct nlist);
  3178. -   for (i = 0; i < n; ++i)
  3179. -     if (((sym = &entry->symbols[i])->n_type & ~N_EXT) == N_SECT)
  3180. -       {
  3181. -     if (sym->n_sect == entry->text_ordinal)
  3182. -       sym->n_type = (sym->n_type & N_EXT) | N_TEXT;
  3183. -     else if (sym->n_sect == entry->data_ordinal)
  3184. -       sym->n_type = (sym->n_type & N_EXT) | N_DATA;
  3185. -     else if (sym->n_sect == entry->bss_ordinal)
  3186. -       sym->n_type = (sym->n_type & N_EXT) | N_BSS;
  3187. -     else
  3188. -       fatal_with_file ("unknown section referenced in symbols of ", entry);
  3189. -     sym->n_sect = 0;
  3190. -       }
  3191. -     else if ((sym = &entry->symbols[i])->n_type == N_SLINE)
  3192. -       {
  3193. -     if (sym->n_sect == entry->text_ordinal)
  3194. -       sym->n_type = N_SLINE;
  3195. -     else if (sym->n_sect == entry->data_ordinal)
  3196. -       sym->n_type = N_DSLINE;
  3197. -     else if (sym->n_sect == entry->bss_ordinal)
  3198. -       sym->n_type = N_BSLINE;
  3199. -     else
  3200. -       fatal_with_file ("unknown section referenced in debugging symbols of ", entry);
  3201. -       }
  3202. - }
  3203. - /* Convert Mach-O style relocation info into a.out style relocation
  3204. -    info internally.  */
  3205. - void
  3206. - translate_mach_o_relocation (entry, reloc, count)
  3207. -      struct file_entry *entry;
  3208. -      struct relocation_info *reloc;
  3209. -      int count;
  3210. - {
  3211. -   int i;
  3212. -   for (i = 0; i < count; ++i)
  3213. -     if (!RELOC_EXTERN_P(&reloc[i]))
  3214. -       if (RELOC_TYPE(&reloc[i]) == R_ABS)
  3215. -     RELOC_TYPE(&reloc[i]) = N_ABS;
  3216. -       else if (RELOC_TYPE(&reloc[i]) == entry->text_ordinal)
  3217. -     RELOC_TYPE(&reloc[i]) = N_TEXT;
  3218. -       else if (RELOC_TYPE(&reloc[i]) == entry->data_ordinal)
  3219. -     RELOC_TYPE(&reloc[i]) = N_DATA;
  3220. -       else if (RELOC_TYPE(&reloc[i]) == entry->bss_ordinal)
  3221. -     RELOC_TYPE(&reloc[i]) = N_BSS;
  3222. -       else
  3223. -     fatal_with_file ("unknown section ordinal in relocation info of ", entry);
  3224. - }
  3225. - /* Header structure for OUTPUT_RELOCATABLE.  */
  3226. - struct
  3227. - {
  3228. -   struct mach_header header;
  3229. -   struct segment_command segment;
  3230. -   struct section text;
  3231. -   struct section data;
  3232. -   struct section bss;
  3233. -   struct symtab_command symtab;
  3234. - #ifdef LC_SYMSEG
  3235. -   struct symseg_command symseg;
  3236. - #endif
  3237. - } m_object;
  3238. - #ifdef NeXT
  3239. - #define CPU_TYPE CPU_TYPE_MC68030
  3240. - #define CPU_SUBTYPE CPU_SUBTYPE_NeXT
  3241. - #define THREAD_FLAVOR NeXT_THREAD_STATE_REGS
  3242. - #define THREAD_COUNT NeXT_THREAD_STATE_REGS_COUNT
  3243. - typedef struct NeXT_thread_state_regs thread_state;
  3244. - #define thread_state_entry_field pc
  3245. - #endif
  3246. - /* Header structure for all executable output forms.  */
  3247. - struct
  3248. - {
  3249. -   struct mach_header header;
  3250. -   struct segment_command pagezero;
  3251. -   struct segment_command text_segment;
  3252. -   struct section text;
  3253. -   struct segment_command data_segment;
  3254. -   struct section data;
  3255. -   struct section bss;
  3256. -   struct thread_command unixthread;
  3257. -   unsigned long int flavor;
  3258. -   unsigned long int count;
  3259. -   thread_state state;
  3260. -   struct symtab_command symtab;
  3261. - #ifdef LC_SYMSEG
  3262. -   struct symseg_command symseg;
  3263. - #endif
  3264. - } m_exec;
  3265. - /* Compute text_start and text_header_size for an a.out file.  */
  3266. - void
  3267. - initialize_mach_o_text_start ()
  3268. - {
  3269. -   if (output_style != OUTPUT_RELOCATABLE)
  3270. -     {
  3271. -       text_header_size = sizeof m_exec;
  3272. -       if (!T_flag_specified && output_style != OUTPUT_RELOCATABLE)
  3273. -     /* We reserve the first page of an executable to trap NULL dereferences.  */
  3274. -     text_start = page_size;
  3275. -     }
  3276. - }
  3277. - /* Compute data_start once text_size is known.  */
  3278. - void
  3279. - initialize_mach_o_data_start ()
  3280. - {
  3281. -   if (! Tdata_flag_specified)
  3282. -     data_start = text_start + text_size;
  3283. - }
  3284. - /* Compute offsets of various pieces of the Mach-O output file.  */
  3285. - void
  3286. - compute_mach_o_section_offsets ()
  3287. - {
  3288. -   int header_size, trsize, drsize;
  3289. -   switch (output_style)
  3290. -     {
  3291. -     case OUTPUT_RELOCATABLE:
  3292. -       header_size = sizeof m_object;
  3293. -       break;
  3294. -     default:
  3295. -       header_size = sizeof m_exec;
  3296. -       break;
  3297. -     }
  3298. -   if (strip_symbols == STRIP_ALL)
  3299. -     nsyms = 0;
  3300. -   else
  3301. -     {
  3302. -       nsyms = (defined_global_sym_count
  3303. -            + undefined_global_sym_count);
  3304. -       if (discard_locals == DISCARD_L)
  3305. -     nsyms += non_L_local_sym_count;
  3306. -       else if (discard_locals == DISCARD_NONE)
  3307. -     nsyms += local_sym_count;
  3308. -       /* One extra for following reference on indirects */
  3309. -       if (output_style == OUTPUT_RELOCATABLE)
  3310. - #ifndef NeXT
  3311. -     nsyms += set_symbol_count + global_indirect_count;
  3312. - #else
  3313. -         nsyms += set_symbol_count;
  3314. - #endif
  3315. -     }
  3316. -   if (strip_symbols == STRIP_NONE)
  3317. -     nsyms += debugger_sym_count;
  3318. -   if (output_style != OUTPUT_RELOCATABLE)
  3319. -     output_text_offset = header_size;
  3320. -   output_data_offset = output_text_offset + text_size;
  3321. -   output_trel_offset = output_data_offset + data_size;
  3322. -   if (output_style == OUTPUT_RELOCATABLE)
  3323. -     trsize = text_reloc_size, drsize = data_reloc_size;
  3324. -   else
  3325. -     trsize = drsize = 0;
  3326. -   output_drel_offset = output_trel_offset + trsize;
  3327. -   output_syms_offset = output_drel_offset + drsize;
  3328. -   output_strs_offset = output_syms_offset + nsyms * sizeof (struct nlist);
  3329. - }
  3330. - /* Compute more section offsets once the size of the string table is known.  */
  3331. - void
  3332. - compute_more_mach_o_section_offsets ()
  3333. - {
  3334. -   output_symseg_offset = output_strs_offset + output_strs_size;
  3335. - }
  3336. - /* Write the Mach-O header once everything else is known.  */
  3337. - void
  3338. - write_mach_o_header ()
  3339. - {
  3340. -   struct mach_header header;
  3341. -   struct section text, data, bss;
  3342. -   struct symtab_command symtab;
  3343. - #ifdef LC_SYMSEG
  3344. -   struct symseg_command symseg;
  3345. - #endif
  3346. -   thread_state state;
  3347. -   lseek (outdesc, 0L, 0);
  3348. -   header.magic = MH_MAGIC;
  3349. -   header.cputype = CPU_TYPE;
  3350. -   header.cpusubtype = CPU_SUBTYPE;
  3351. -   header.filetype = output_style == OUTPUT_RELOCATABLE ? MH_OBJECT : MH_EXECUTE;
  3352. - #ifdef LC_SYMSEG
  3353. -   switch (output_style)
  3354. -     {
  3355. -     case OUTPUT_RELOCATABLE:
  3356. -       header.ncmds = 3;
  3357. -       header.sizeofcmds = sizeof m_object - sizeof header;
  3358. -       break;
  3359. -     default:
  3360. -       header.ncmds = 6;
  3361. -       header.sizeofcmds = sizeof m_exec - sizeof header;
  3362. -       break;
  3363. -     }
  3364. - #else
  3365. -   switch (output_style)
  3366. -     {
  3367. -     case OUTPUT_RELOCATABLE:
  3368. -       header.ncmds = 2;
  3369. -       header.sizeofcmds = sizeof m_object - sizeof header;
  3370. -       break;
  3371. -     default:
  3372. -       header.ncmds = 5;
  3373. -       header.sizeofcmds = sizeof m_exec - sizeof header;
  3374. -       break;
  3375. -     }
  3376. - #endif
  3377. -   header.flags = undefined_global_sym_count ? 0 : MH_NOUNDEFS;
  3378. -   bzero((char *) &text, sizeof text);
  3379. -   strncpy(text.sectname, SECT_TEXT, sizeof text.sectname);
  3380. -   strncpy(text.segname, SEG_TEXT, sizeof text.segname);
  3381. -   text.addr = text_start;
  3382. -   text.size = text_size;
  3383. -   text.offset = output_text_offset;
  3384. -   text.align = text.addr % sizeof (double) ? sizeof (int) : sizeof (double);
  3385. -   text.reloff = output_trel_offset;
  3386. -   text.nreloc = output_style == OUTPUT_RELOCATABLE
  3387. -     ? text_reloc_size / sizeof (struct relocation_info) : 0;
  3388. -   text.flags = 0;
  3389. -   bzero((char *) &data, sizeof data);
  3390. -   strncpy(data.sectname, SECT_DATA, sizeof data.sectname);
  3391. -   strncpy(data.segname, output_style == OUTPUT_WRITABLE_TEXT ? SEG_TEXT : SEG_DATA,
  3392. -       sizeof data.segname);
  3393. -   data.addr = data_start;
  3394. -   data.size = data_size;
  3395. -   data.offset = output_data_offset;
  3396. -   data.align = data.addr % sizeof (double) ? sizeof (int) : sizeof (double);
  3397. -   data.reloff = output_drel_offset;
  3398. -   data.nreloc = output_style == OUTPUT_RELOCATABLE
  3399. -     ? data_reloc_size / sizeof (struct relocation_info) : 0;
  3400. -   data.flags = 0;
  3401. -   bzero((char *) &bss, sizeof bss);
  3402. -   strncpy(bss.sectname, SECT_BSS, sizeof data.sectname);
  3403. -   strncpy(bss.segname, output_style == OUTPUT_WRITABLE_TEXT ? SEG_TEXT : SEG_DATA,
  3404. -       sizeof bss.segname);
  3405. -   bss.addr = data_start + data_size;
  3406. -   bss.size = bss_size;
  3407. -   bss.align = bss.addr % sizeof (double) ? sizeof (int) : sizeof (double);
  3408. -   bss.reloff = 0;
  3409. -   bss.nreloc = 0;
  3410. -   bss.flags = S_ZEROFILL;
  3411. -   symtab.cmd = LC_SYMTAB;
  3412. -   symtab.cmdsize = sizeof symtab;
  3413. -   symtab.symoff = output_syms_offset;
  3414. -   symtab.nsyms = output_syms_size / sizeof (struct nlist);
  3415. -   symtab.stroff = output_strs_offset;
  3416. -   symtab.strsize = output_strs_size;
  3417. - #ifdef LC_SYMSEG
  3418. -   symseg.cmd = LC_SYMSEG;
  3419. -   symseg.cmdsize = sizeof symseg;
  3420. -   symseg.offset = output_symseg_offset;
  3421. -   symseg.size = output_symseg_size;
  3422. - #endif
  3423. -   switch (output_style)
  3424. -     {
  3425. -     case OUTPUT_RELOCATABLE:
  3426. -       m_object.header = header;
  3427. -       m_object.segment.cmd = LC_SEGMENT;
  3428. -       m_object.segment.cmdsize = sizeof (struct segment_command) + 3 * sizeof (struct section);
  3429. -       strncpy(m_object.segment.segname, SEG_TEXT, sizeof m_object.segment.segname);
  3430. -       m_object.segment.vmaddr = 0;
  3431. -       m_object.segment.vmsize = text.size + data.size + bss.size;
  3432. -       m_object.segment.fileoff = text.offset;
  3433. -       m_object.segment.filesize = text.size + data.size;
  3434. -       m_object.segment.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3435. -       m_object.segment.initprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3436. -       m_object.segment.nsects = 3;
  3437. -       m_object.segment.flags = 0;
  3438. -       m_object.text = text;
  3439. -       m_object.data = data;
  3440. -       m_object.bss = bss;
  3441. -       m_object.symtab = symtab;
  3442. - #ifdef LC_SYMSEG
  3443. -       m_object.symseg = symseg;
  3444. - #endif
  3445. -       mywrite((char *) &m_object, 1, sizeof m_object, outdesc);
  3446. -       break;
  3447. -     default:
  3448. -       m_exec.header = header;
  3449. -       m_exec.pagezero.cmd = LC_SEGMENT;
  3450. -       m_exec.pagezero.cmdsize = sizeof (struct segment_command);
  3451. -       strncpy(m_exec.pagezero.segname, SEG_PAGEZERO, sizeof m_exec.pagezero.segname);
  3452. -       m_exec.pagezero.vmaddr = 0;
  3453. -       m_exec.pagezero.vmsize = page_size;
  3454. -       m_exec.pagezero.fileoff = 0;
  3455. -       m_exec.pagezero.filesize = 0;
  3456. -       m_exec.pagezero.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3457. -       m_exec.pagezero.initprot = 0;
  3458. -       m_exec.pagezero.nsects = 0;
  3459. -       m_exec.pagezero.flags = 0;
  3460. -       m_exec.text_segment.cmd = LC_SEGMENT;
  3461. -       m_exec.text_segment.cmdsize = sizeof (struct segment_command) + sizeof (struct section);
  3462. -       strncpy(m_exec.text_segment.segname, SEG_TEXT, sizeof m_exec.text_segment.segname);
  3463. -       m_exec.text_segment.vmaddr = text_start;
  3464. -       m_exec.text_segment.vmsize = text_size;
  3465. -       m_exec.text_segment.fileoff = output_text_offset;
  3466. -       m_exec.text_segment.filesize = text_size;
  3467. -       m_exec.text_segment.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3468. -       m_exec.text_segment.initprot = VM_PROT_READ | VM_PROT_EXECUTE;
  3469. -       if (output_style == OUTPUT_WRITABLE_TEXT)
  3470. -     m_exec.text_segment.initprot |= VM_PROT_WRITE;
  3471. -       m_exec.text_segment.nsects = 1;
  3472. -       m_exec.text_segment.flags = 0;
  3473. -       m_exec.text = text;
  3474. -       m_exec.data_segment.cmd = LC_SEGMENT;
  3475. -       m_exec.data_segment.cmdsize = sizeof (struct segment_command) + 2 * sizeof (struct section);
  3476. -       strncpy(m_exec.data_segment.segname, SEG_DATA, sizeof m_exec.data_segment.segname);
  3477. -       m_exec.data_segment.vmaddr = data_start;
  3478. -       m_exec.data_segment.vmsize = data_size + bss_size;
  3479. -       m_exec.data_segment.fileoff = output_data_offset;
  3480. -       m_exec.data_segment.filesize = data_size;
  3481. -       m_exec.data_segment.maxprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3482. -       m_exec.data_segment.initprot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
  3483. -       m_exec.data_segment.nsects = 2;
  3484. -       m_exec.data_segment.flags = 0;
  3485. -       m_exec.data = data;
  3486. -       m_exec.bss = bss;
  3487. -       m_exec.unixthread.cmd = LC_UNIXTHREAD;
  3488. -       m_exec.unixthread.cmdsize
  3489. -     = sizeof (struct thread_command) + 2 * sizeof (long int) + sizeof (thread_state);
  3490. -       m_exec.flavor = THREAD_FLAVOR;
  3491. -       m_exec.count = THREAD_COUNT;
  3492. -       m_exec.state.thread_state_entry_field = entry_symbol
  3493. -     ? entry_symbol->value : text_start + text_header_size;
  3494. -       m_exec.symtab = symtab;
  3495. - #ifdef LC_SYMSEG
  3496. -       m_exec.symseg = symseg;
  3497. - #endif
  3498. -       mywrite((char *) &m_exec, 1, sizeof m_exec, outdesc);
  3499. -       break;
  3500. -     }
  3501. - }
  3502. - /* Translate a.out style symbols into Mach-O style symbols.  */
  3503. - void
  3504. - generate_mach_o_symbols (syms, nsyms)
  3505. -      struct nlist *syms;
  3506. -      int nsyms;
  3507. - {
  3508. -   int i;
  3509. -   for (i = 0; i < nsyms; ++i)
  3510. -     switch (syms[i].n_type)
  3511. -       {
  3512. -       case N_TEXT:
  3513. -       case N_TEXT | N_EXT:
  3514. -     syms[i].n_type = syms[i].n_type & N_EXT | N_SECT;
  3515. -     syms[i].n_sect = 1;    /* text section ordinal */
  3516. -     break;
  3517. -       case N_DATA:
  3518. -       case N_DATA | N_EXT:
  3519. -     syms[i].n_type = syms[i].n_type & N_EXT | N_SECT;
  3520. -     syms[i].n_sect = 2;    /* data section ordinal */
  3521. -     break;
  3522. -       case N_BSS:
  3523. -       case N_BSS | N_EXT:
  3524. -     syms[i].n_type = syms[i].n_type & N_EXT | N_BSS;
  3525. -     syms[i].n_sect = 3;    /* bss section ordinal */
  3526. -     break;
  3527. -       case N_SLINE:
  3528. -     syms[i].n_type = N_SLINE;
  3529. -     syms[i].n_sect = 1;    /* text section ordinal */
  3530. -     break;
  3531. -       case N_DSLINE:
  3532. -     syms[i].n_type = N_SLINE;
  3533. -     syms[i].n_sect = 2;    /* data section ordinal */
  3534. -     break;
  3535. -       case N_BSLINE:
  3536. -     syms[i].n_type = N_SLINE;
  3537. -     syms[i].n_sect = 3;    /* bss section ordinal */
  3538. -     break;
  3539. -       }
  3540. - }
  3541. - /* Translate a.out style relocation info into Mach-O style relocation
  3542. -    info.  */
  3543. - void
  3544. - generate_mach_o_relocations (reloc, nreloc)
  3545. -      struct relocation_info *reloc;
  3546. -      int nreloc;
  3547. - {
  3548. -   int i;
  3549. -   for (i = 0; i < nreloc; ++i)
  3550. -     if (!RELOC_EXTERN_P (&reloc[i]))
  3551. -       switch (RELOC_TYPE (&reloc[i]))
  3552. -     {
  3553. -     case N_ABS:
  3554. -     case N_ABS | N_EXT:
  3555. -       RELOC_TYPE (&reloc[i]) = R_ABS;
  3556. -       break;
  3557. -     case N_TEXT:
  3558. -     case N_TEXT | N_EXT:
  3559. -       RELOC_TYPE (&reloc[i]) = 1; /* output text section ordinal */
  3560. -       break;
  3561. -     case N_DATA:
  3562. -     case N_DATA | N_EXT:
  3563. -       RELOC_TYPE (&reloc[i]) = 2; /* output data section ordinal */
  3564. -       break;
  3565. -     case N_BSS:
  3566. -     case N_BSS | N_EXT:
  3567. -       RELOC_TYPE (&reloc[i]) = 3; /* output bss section ordinal */
  3568. -       break;
  3569. -     }
  3570. - }
  3571. - #endif
  3572. - /* The following functions are simple switches according to the
  3573. -    output style.  */
  3574. - /* Compute text_start and text_header_size as appropriate for the
  3575. -    output format.  */
  3576. - void
  3577. - initialize_text_start ()
  3578. - {
  3579. - #ifdef A_OUT
  3580. -   if (output_file_type == IS_A_OUT)
  3581. -     {
  3582. -       initialize_a_out_text_start ();
  3583. -       return;
  3584. -     }
  3585. - #endif
  3586. - #ifdef MACH_O
  3587. -   if (output_file_type == IS_MACH_O)
  3588. -     {
  3589. -       initialize_mach_o_text_start ();
  3590. -       return;
  3591. -     }
  3592. - #endif
  3593. -   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3594. - }
  3595. - /* Initialize data_start as appropriate to the output format, once text_size
  3596. -    is known.  */
  3597. - void
  3598. - initialize_data_start ()
  3599. - {
  3600. - #ifdef A_OUT
  3601. -   if (output_file_type == IS_A_OUT)
  3602. -     {
  3603. -       initialize_a_out_data_start ();
  3604. -       return;
  3605. -     }
  3606. - #endif
  3607. - #ifdef MACH_O
  3608. -   if (output_file_type == IS_MACH_O)
  3609. -     {
  3610. -       initialize_mach_o_data_start ();
  3611. -       return;
  3612. -     }
  3613. - #endif
  3614. -   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3615. - }
  3616. - /* Compute offsets of the various sections within the output file.  */
  3617. - void
  3618. - compute_section_offsets ()
  3619. - {
  3620. - #ifdef A_OUT
  3621. -   if (output_file_type == IS_A_OUT)
  3622. -     {
  3623. -       compute_a_out_section_offsets ();
  3624. -       return;
  3625. -     }
  3626. - #endif
  3627. - #ifdef MACH_O
  3628. -   if (output_file_type == IS_MACH_O)
  3629. -     {
  3630. -       compute_mach_o_section_offsets ();
  3631. -       return;
  3632. -     }
  3633. - #endif
  3634. -   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3635. - }
  3636. - /* Compute more section offsets, once the size of the string table
  3637. -    is finalized.  */
  3638. - void
  3639. - compute_more_section_offsets ()
  3640. - {
  3641. - #ifdef A_OUT
  3642. -   if (output_file_type == IS_A_OUT)
  3643. -     {
  3644. -       compute_more_a_out_section_offsets ();
  3645. -       return;
  3646. -     }
  3647. - #endif
  3648. - #ifdef MACH_O
  3649. -   if (output_file_type == IS_MACH_O)
  3650. -     {
  3651. -       compute_more_mach_o_section_offsets ();
  3652. -       return;
  3653. -     }
  3654. - #endif
  3655. -   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3656. - }
  3657. - /* Write the output file header, once everything is known.  */
  3658. - void
  3659. - write_header ()
  3660. - {
  3661. - #ifdef A_OUT
  3662. -   if (output_file_type == IS_A_OUT)
  3663. -     {
  3664. -       write_a_out_header ();
  3665. -       return;
  3666. -     }
  3667. - #endif
  3668. - #ifdef MACH_O
  3669. -   if (output_file_type == IS_MACH_O)
  3670. -     {
  3671. -       write_mach_o_header ();
  3672. -       return;
  3673. -     }
  3674. - #endif
  3675. -   fatal ("unknown output file type (enum file_type)", (char *) 0);
  3676. - }
  3677. - /* Write the output file */
  3678. - void
  3679. - write_output ()
  3680. - {
  3681. -   struct stat statbuf;
  3682. -   int filemode, mask;
  3683. -   /* Remove the old file in case it is owned by someone else.
  3684. -      This prevents spurious "not owner" error messages.
  3685. -      Don't check for errors from unlink; we don't really care
  3686. -      whether it worked.
  3687. -      Note that this means that if the output file is hard linked,
  3688. -      the other names will still have the old contents.  This is
  3689. -      the way Unix ld works; I'm going to consider it a feature.  */
  3690. -   (void) unlink (output_filename);
  3691. -   
  3692. -   outdesc = open (output_filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
  3693. -   if (outdesc < 0) perror_name (output_filename);
  3694. -   if (fstat (outdesc, &statbuf) < 0)
  3695. -     perror_name (output_filename);
  3696. -   filemode = statbuf.st_mode;
  3697. -   chmod (output_filename, filemode & ~0111);
  3698. -   /* Calculate the offsets of the various pieces of the output file.  */
  3699. -   compute_section_offsets ();
  3700. -   /* Output the text and data segments, relocating as we go.  */
  3701. -   write_text ();
  3702. -   write_data ();
  3703. -   /* Output the merged relocation info, if requested with `-r'.  */
  3704. -   if (output_style == OUTPUT_RELOCATABLE)
  3705. -     write_rel ();
  3706. -   /* Output the symbol table (both globals and locals).  */
  3707. -   write_syms ();
  3708. -   /* At this point the total size of the symbol table and string table
  3709. -      are finalized.  */
  3710. -   compute_more_section_offsets ();
  3711. -   /* Copy any GDB symbol segments from input files.  */
  3712. -   write_symsegs ();
  3713. -   /* Now that everything is known about the output file, write its header.  */
  3714. -   write_header ();
  3715. -   close (outdesc);
  3716. -   mask = umask (0);
  3717. -   umask (mask);
  3718. -   if (chmod (output_filename, filemode | (0111 & ~mask)) == -1)
  3719. -     perror_name (output_filename);
  3720. - }
  3721.   
  3722. - void modify_location (), perform_relocation (), copy_text (), copy_data ();
  3723.   /* Relocate the text segment of each input file
  3724.      and write to the output file.  */
  3725.   
  3726. --- 3432,3438 ----
  3727. ***************
  3728. *** 4574,4582 ****
  3729.     if (trace_files)
  3730.       fprintf (stderr, "Copying and relocating text:\n\n");
  3731.   
  3732. !   lseek (outdesc, output_text_offset + text_header_size, 0);
  3733. !   each_full_file (copy_text, 0);
  3734.     file_close ();
  3735.   
  3736.     if (trace_files)
  3737. --- 3442,3448 ----
  3738.     if (trace_files)
  3739.       fprintf (stderr, "Copying and relocating text:\n\n");
  3740.   
  3741. !   each_full_file (copy_text);
  3742.     file_close ();
  3743.   
  3744.     if (trace_files)
  3745. ***************
  3746. *** 4585,4596 ****
  3747.     padfile (text_pad, outdesc);
  3748.   }
  3749.   
  3750.   /* Read in all of the relocation information */
  3751.   
  3752.   void
  3753.   read_relocation ()
  3754.   {
  3755. !   each_full_file (read_file_relocation, 0);
  3756.   }
  3757.   
  3758.   /* Read in the relocation sections of ENTRY if necessary */
  3759. --- 3451,3469 ----
  3760.     padfile (text_pad, outdesc);
  3761.   }
  3762.   
  3763. + int
  3764. + text_offset (entry)
  3765. +      struct file_entry *entry;
  3766. + {
  3767. +   return entry->starting_offset + N_TXTOFF (entry->header);
  3768. + }
  3769.   /* Read in all of the relocation information */
  3770.   
  3771.   void
  3772.   read_relocation ()
  3773.   {
  3774. !   each_full_file (read_file_relocation);
  3775.   }
  3776.   
  3777.   /* Read in the relocation sections of ENTRY if necessary */
  3778. ***************
  3779. *** 4606,4615 ****
  3780.     desc = -1;
  3781.     if (!entry->textrel)
  3782.       {
  3783. !       reloc = (struct relocation_info *) xmalloc (entry->text_reloc_size);
  3784.         desc = file_open (entry);
  3785. !       lseek (desc, entry->starting_offset + entry->text_reloc_offset, L_SET);
  3786. !       if (entry->text_reloc_size != (read_return = read (desc, reloc, entry->text_reloc_size)))
  3787.       {
  3788.         fprintf (stderr, "Return from read: %d\n", read_return);
  3789.         fatal_with_file ("premature eof in text relocation of ", entry);
  3790. --- 3479,3490 ----
  3791.     desc = -1;
  3792.     if (!entry->textrel)
  3793.       {
  3794. !       reloc = (struct relocation_info *) xmalloc (entry->header.a_trsize);
  3795.         desc = file_open (entry);
  3796. !       lseek (desc,
  3797. !          text_offset (entry) + entry->header.a_text + entry->header.a_data,
  3798. !          L_SET);
  3799. !       if (entry->header.a_trsize != (read_return = read (desc, reloc, entry->header.a_trsize)))
  3800.       {
  3801.         fprintf (stderr, "Return from read: %d\n", read_return);
  3802.         fatal_with_file ("premature eof in text relocation of ", entry);
  3803. ***************
  3804. *** 4619,4641 ****
  3805.   
  3806.     if (!entry->datarel)
  3807.       {
  3808. !       reloc = (struct relocation_info *) xmalloc (entry->data_reloc_size);
  3809.         if (desc == -1) desc = file_open (entry);
  3810. !       lseek (desc, entry->starting_offset + entry->data_reloc_offset, L_SET);
  3811. !       if (entry->data_reloc_size != read (desc, reloc, entry->data_reloc_size))
  3812.       fatal_with_file ("premature eof in data relocation of ", entry);
  3813.         entry->datarel = reloc;
  3814.       }
  3815. - #ifdef MACH_O
  3816. -   if (entry->file_type == IS_MACH_O)
  3817. -     {
  3818. -       translate_mach_o_relocation (entry, entry->textrel,
  3819. -                    entry->text_reloc_size / sizeof (struct relocation_info));
  3820. -       translate_mach_o_relocation (entry, entry->datarel,
  3821. -                    entry->data_reloc_size / sizeof (struct relocation_info));
  3822. -     }
  3823. - #endif
  3824.   }
  3825.   
  3826.   /* Read the text segment contents of ENTRY, relocate them,
  3827. --- 3494,3509 ----
  3828.   
  3829.     if (!entry->datarel)
  3830.       {
  3831. !       reloc = (struct relocation_info *) xmalloc (entry->header.a_drsize);
  3832.         if (desc == -1) desc = file_open (entry);
  3833. !       lseek (desc,
  3834. !          text_offset (entry) + entry->header.a_text
  3835. !          + entry->header.a_data + entry->header.a_trsize,
  3836. !          L_SET);
  3837. !       if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  3838.       fatal_with_file ("premature eof in data relocation of ", entry);
  3839.         entry->datarel = reloc;
  3840.       }
  3841.   }
  3842.   
  3843.   /* Read the text segment contents of ENTRY, relocate them,
  3844. ***************
  3845. *** 4657,4668 ****
  3846.   
  3847.     /* Allocate space for the file's text section */
  3848.   
  3849. !   bytes = (char *) alloca (entry->text_size);
  3850.   
  3851.     /* Deal with relocation information however is appropriate */
  3852.   
  3853.     if (entry->textrel)  reloc = entry->textrel;
  3854. !   else if (output_style == OUTPUT_RELOCATABLE)
  3855.       {
  3856.         read_file_relocation (entry);
  3857.         reloc = entry->textrel;
  3858. --- 3525,3536 ----
  3859.   
  3860.     /* Allocate space for the file's text section */
  3861.   
  3862. !   bytes = (char *) alloca (entry->header.a_text);
  3863.   
  3864.     /* Deal with relocation information however is appropriate */
  3865.   
  3866.     if (entry->textrel)  reloc = entry->textrel;
  3867. !   else if (relocatable_output)
  3868.       {
  3869.         read_file_relocation (entry);
  3870.         reloc = entry->textrel;
  3871. ***************
  3872. *** 4669,4699 ****
  3873.       }
  3874.     else
  3875.       {
  3876. !       reloc = (struct relocation_info *) alloca (entry->text_reloc_size);
  3877. !       lseek (desc, entry->starting_offset + entry->text_reloc_offset, L_SET);
  3878. !       if (entry->text_reloc_size != read (desc, reloc, entry->text_reloc_size))
  3879.       fatal_with_file ("premature eof in text relocation of ", entry);
  3880. - #ifdef MACH_O
  3881. -       if (entry->file_type == IS_MACH_O)
  3882. -     translate_mach_o_relocation (entry, reloc,
  3883. -                      entry->text_reloc_size / sizeof (struct relocation_info));
  3884. - #endif
  3885.       }
  3886.   
  3887.     /* Read the text section into core.  */
  3888.   
  3889. !   lseek (desc, entry->starting_offset + entry->text_offset, L_SET);
  3890. !   if (entry->text_size != read (desc, bytes, entry->text_size))
  3891.       fatal_with_file ("premature eof in text section of ", entry);
  3892.   
  3893.     /* Relocate the text according to the text relocation.  */
  3894.   
  3895. !   perform_relocation (bytes, entry->text_start_address - entry->orig_text_address,
  3896. !               entry->text_size, reloc, entry->text_reloc_size, entry);
  3897.   
  3898.     /* Write the relocated text to the output file.  */
  3899.   
  3900. !   mywrite (bytes, 1, entry->text_size, outdesc);
  3901.   }
  3902.   
  3903.   /* Relocate the data segment of each input file
  3904. --- 3537,3563 ----
  3905.       }
  3906.     else
  3907.       {
  3908. !       reloc = (struct relocation_info *) alloca (entry->header.a_trsize);
  3909. !       lseek (desc, text_offset (entry) + entry->header.a_text + entry->header.a_data, 0);
  3910. !       if (entry->header.a_trsize != read (desc, reloc, entry->header.a_trsize))
  3911.       fatal_with_file ("premature eof in text relocation of ", entry);
  3912.       }
  3913.   
  3914.     /* Read the text section into core.  */
  3915.   
  3916. !   lseek (desc, text_offset (entry), 0);
  3917. !   if (entry->header.a_text != read (desc, bytes, entry->header.a_text))
  3918.       fatal_with_file ("premature eof in text section of ", entry);
  3919.   
  3920.     /* Relocate the text according to the text relocation.  */
  3921.   
  3922. !   perform_relocation (bytes, entry->text_start_address, entry->header.a_text,
  3923. !               reloc, entry->header.a_trsize, entry);
  3924.   
  3925.     /* Write the relocated text to the output file.  */
  3926.   
  3927. !   mywrite (bytes, 1, entry->header.a_text, outdesc);
  3928.   }
  3929.   
  3930.   /* Relocate the data segment of each input file
  3931. ***************
  3932. *** 4705,4713 ****
  3933.     if (trace_files)
  3934.       fprintf (stderr, "Copying and relocating data:\n\n");
  3935.   
  3936. !   lseek (outdesc, output_data_offset, 0);
  3937. !   each_full_file (copy_data, 0);
  3938.     file_close ();
  3939.   
  3940.     /* Write out the set element vectors.  See digest symbols for
  3941. --- 3569,3575 ----
  3942.     if (trace_files)
  3943.       fprintf (stderr, "Copying and relocating data:\n\n");
  3944.   
  3945. !   each_full_file (copy_data);
  3946.     file_close ();
  3947.   
  3948.     /* Write out the set element vectors.  See digest symbols for
  3949. ***************
  3950. *** 4741,4750 ****
  3951.   
  3952.     desc = file_open (entry);
  3953.   
  3954. !   bytes = (char *) alloca (entry->data_size);
  3955.   
  3956.     if (entry->datarel) reloc = entry->datarel;
  3957. !   else if (output_style == OUTPUT_RELOCATABLE)    /* Will need this again */
  3958.       {
  3959.         read_file_relocation (entry);
  3960.         reloc = entry->datarel;
  3961. --- 3603,3612 ----
  3962.   
  3963.     desc = file_open (entry);
  3964.   
  3965. !   bytes = (char *) alloca (entry->header.a_data);
  3966.   
  3967.     if (entry->datarel) reloc = entry->datarel;
  3968. !   else if (relocatable_output)    /* Will need this again */
  3969.       {
  3970.         read_file_relocation (entry);
  3971.         reloc = entry->datarel;
  3972. ***************
  3973. *** 4751,4775 ****
  3974.       }
  3975.     else
  3976.       {
  3977. !       reloc = (struct relocation_info *) alloca (entry->data_reloc_size);
  3978. !       lseek (desc, entry->starting_offset + entry->data_reloc_offset, L_SET);
  3979. !       if (entry->data_reloc_size != read (desc, reloc, entry->data_reloc_size))
  3980.       fatal_with_file ("premature eof in data relocation of ", entry);
  3981. - #ifdef MACH_O
  3982. -       if (entry->file_type == IS_MACH_O)
  3983. -     translate_mach_o_relocation (entry, reloc,
  3984. -                      entry->data_reloc_size / sizeof (struct relocation_info));
  3985. - #endif
  3986.       }
  3987.   
  3988. !   lseek (desc, entry->starting_offset + entry->data_offset, L_SET);
  3989. !   if (entry->data_size != read (desc, bytes, entry->data_size))
  3990.       fatal_with_file ("premature eof in data section of ", entry);
  3991.   
  3992. !   perform_relocation (bytes, entry->data_start_address - entry->orig_data_address,
  3993. !               entry->data_size, reloc, entry->data_reloc_size, entry);
  3994.   
  3995. !   mywrite (bytes, 1, entry->data_size, outdesc);
  3996.   }
  3997.   
  3998.   /* Relocate ENTRY's text or data section contents.
  3999. --- 3613,3634 ----
  4000.       }
  4001.     else
  4002.       {
  4003. !       reloc = (struct relocation_info *) alloca (entry->header.a_drsize);
  4004. !       lseek (desc, text_offset (entry) + entry->header.a_text
  4005. !          + entry->header.a_data + entry->header.a_trsize,
  4006. !          0);
  4007. !       if (entry->header.a_drsize != read (desc, reloc, entry->header.a_drsize))
  4008.       fatal_with_file ("premature eof in data relocation of ", entry);
  4009.       }
  4010.   
  4011. !   lseek (desc, text_offset (entry) + entry->header.a_text, 0);
  4012. !   if (entry->header.a_data != read (desc, bytes, entry->header.a_data))
  4013.       fatal_with_file ("premature eof in data section of ", entry);
  4014.   
  4015. !   perform_relocation (bytes, entry->data_start_address - entry->header.a_text,
  4016. !               entry->header.a_data, reloc, entry->header.a_drsize, entry);
  4017.   
  4018. !   mywrite (bytes, 1, entry->header.a_data, outdesc);
  4019.   }
  4020.   
  4021.   /* Relocate ENTRY's text or data section contents.
  4022. ***************
  4023. *** 4779,4785 ****
  4024.        in the output file and its address in the input file.
  4025.      RELOC_INFO is the address of the relocation info, in core.
  4026.      RELOC_SIZE is its length in bytes.  */
  4027. ! /* This version is about to be severly hacked by Randy.  Hope it
  4028.      works afterwards. */
  4029.   void
  4030.   perform_relocation (data, pc_relocation, data_size, reloc_info, reloc_size, entry)
  4031. --- 3638,3644 ----
  4032.        in the output file and its address in the input file.
  4033.      RELOC_INFO is the address of the relocation info, in core.
  4034.      RELOC_SIZE is its length in bytes.  */
  4035. ! /* This version is about to be severley hacked by Randy.  Hope it
  4036.      works afterwards. */
  4037.   void
  4038.   perform_relocation (data, pc_relocation, data_size, reloc_info, reloc_size, entry)
  4039. ***************
  4040. *** 4793,4801 ****
  4041.     register struct relocation_info *p = reloc_info;
  4042.     struct relocation_info *end
  4043.       = reloc_info + reloc_size / sizeof (struct relocation_info);
  4044. !   int text_relocation = entry->text_start_address - entry->orig_text_address;
  4045. !   int data_relocation = entry->data_start_address - entry->orig_data_address;
  4046. !   int bss_relocation = entry->bss_start_address - entry->orig_bss_address;
  4047.   
  4048.     for (; p < end; p++)
  4049.       {
  4050. --- 3652,3661 ----
  4051.     register struct relocation_info *p = reloc_info;
  4052.     struct relocation_info *end
  4053.       = reloc_info + reloc_size / sizeof (struct relocation_info);
  4054. !   int text_relocation = entry->text_start_address;
  4055. !   int data_relocation = entry->data_start_address - entry->header.a_text;
  4056. !   int bss_relocation
  4057. !     = entry->bss_start_address - entry->header.a_text - entry->header.a_data;
  4058.   
  4059.     for (; p < end; p++)
  4060.       {
  4061. ***************
  4062. *** 4820,4826 ****
  4063.           sp = (symbol *) sp->value;
  4064.   #endif
  4065.   
  4066. !       if (symindex >= entry->syms_size)
  4067.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4068.   
  4069.         /* If the symbol is undefined, leave it at zero.  */
  4070. --- 3680,3686 ----
  4071.           sp = (symbol *) sp->value;
  4072.   #endif
  4073.   
  4074. !       if (symindex >= entry->header.a_syms)
  4075.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4076.   
  4077.         /* If the symbol is undefined, leave it at zero.  */
  4078. ***************
  4079. *** 4838,4848 ****
  4080. --- 3698,3713 ----
  4081.   
  4082.       case N_DATA:
  4083.       case N_DATA | N_EXT:
  4084. +       /* A word that points to beginning of the the data section
  4085. +          initially contains not 0 but rather the "address" of that section
  4086. +          in the input file, which is the length of the file's text.  */
  4087.         relocation = data_relocation;
  4088.         break;
  4089.   
  4090.       case N_BSS:
  4091.       case N_BSS | N_EXT:
  4092. +       /* Similarly, an input word pointing to the beginning of the bss
  4093. +          initially contains the length of text plus data of the file.  */
  4094.         relocation = bss_relocation;
  4095.         break;
  4096.   
  4097. ***************
  4098. *** 4860,4866 ****
  4099.   
  4100.   #ifdef RELOC_ADD_EXTRA
  4101.         relocation += RELOC_ADD_EXTRA(p);
  4102. !       if (output_style == OUTPUT_RELOCATABLE)
  4103.       {
  4104.         /* If this RELOC_ADD_EXTRA is 0, it means that the
  4105.            symbol was external and the relocation does not
  4106. --- 3725,3731 ----
  4107.   
  4108.   #ifdef RELOC_ADD_EXTRA
  4109.         relocation += RELOC_ADD_EXTRA(p);
  4110. !       if (relocatable_output)
  4111.       {
  4112.         /* If this RELOC_ADD_EXTRA is 0, it means that the
  4113.            symbol was external and the relocation does not
  4114. ***************
  4115. *** 4918,4939 ****
  4116.         break;
  4117.   
  4118.       case 2:
  4119. - #ifdef CROSS_LINKER
  4120. -       /* This is necessary if the host has stricter alignment
  4121. -          than the target.  Too slow to use all the time.
  4122. -          Also doesn't deal with differing byte-order.  */
  4123. -       {
  4124. -         /* Thing to relocate.  */
  4125. -         long thing;
  4126. -         bcopy (data + addr, &thing, sizeof (thing));
  4127. -         if (RELOC_MEMORY_SUB_P (p))
  4128. -           relocation -= mask & thing;
  4129. -         else if (RELOC_MEMORY_ADD_P (p))
  4130. -           relocation += mask & thing;
  4131. -         thing = (thing & ~mask) | relocation;
  4132. -         bcopy (&thing, data + addr, sizeof (thing));
  4133. -       }
  4134. - #else /* not CROSS_LINKER */
  4135.         if (RELOC_MEMORY_SUB_P(p))
  4136.           relocation -= mask & *(long *) (data + addr);
  4137.         else if (RELOC_MEMORY_ADD_P(p))
  4138. --- 3783,3788 ----
  4139. ***************
  4140. *** 4940,4946 ****
  4141.           relocation += mask & *(long *) (data + addr);
  4142.         *(long *) (data + addr) &= ~mask;
  4143.         *(long *) (data + addr) |= relocation;
  4144. - #endif /* not CROSS_LINKER */
  4145.         break;
  4146.   
  4147.       default:
  4148. --- 3789,3794 ----
  4149. ***************
  4150. *** 4949,4955 ****
  4151.       }
  4152.   }
  4153.   
  4154. ! /* For OUTPUT_RELOCATABLE only: write out the relocation,
  4155.      relocating the addresses-to-be-relocated.  */
  4156.   
  4157.   void coptxtrel (), copdatrel ();
  4158. --- 3797,3803 ----
  4159.       }
  4160.   }
  4161.   
  4162. ! /* For relocatable_output only: write out the relocation,
  4163.      relocating the addresses-to-be-relocated.  */
  4164.   
  4165.   void coptxtrel (), copdatrel ();
  4166. ***************
  4167. *** 4975,5009 ****
  4168.       if (sp->referenced || sp->defined)
  4169.         {
  4170.           sp->def_count = count++;
  4171. - #ifndef NeXT
  4172.           /* Leave room for the reference required by N_INDR, if
  4173.              necessary.  */
  4174.           if ((sp->defined & ~N_EXT) == N_INDR)
  4175.             count++;
  4176. - #endif
  4177.         }
  4178.       }
  4179. !   /* Correct, because if (OUTPUT_RELOCATABLE), we will also be writing
  4180.        whatever indirect blocks we have.  */
  4181. - #ifndef NeXT
  4182.     if (count != defined_global_sym_count
  4183.         + undefined_global_sym_count + global_indirect_count)
  4184. - #else
  4185. -   if (count != defined_global_sym_count
  4186. -       + undefined_global_sym_count)
  4187. - #endif
  4188.       fatal ("internal error");
  4189.   
  4190.     /* Write out the relocations of all files, remembered from copy_text.  */
  4191.   
  4192. !   lseek (outdesc, output_trel_offset, 0);
  4193. !   each_full_file (coptxtrel, 0);
  4194.   
  4195.     if (trace_files)
  4196.       fprintf (stderr, "\nWriting data relocation:\n\n");
  4197.   
  4198. !   lseek (outdesc, output_drel_offset, 0);
  4199. !   each_full_file (copdatrel, 0);
  4200.   
  4201.     if (trace_files)
  4202.       fprintf (stderr, "\n");
  4203. --- 3823,3848 ----
  4204.       if (sp->referenced || sp->defined)
  4205.         {
  4206.           sp->def_count = count++;
  4207.           /* Leave room for the reference required by N_INDR, if
  4208.              necessary.  */
  4209.           if ((sp->defined & ~N_EXT) == N_INDR)
  4210.             count++;
  4211.         }
  4212.       }
  4213. !   /* Correct, because if (reloatable_output), we will also be writing
  4214.        whatever indirect blocks we have.  */
  4215.     if (count != defined_global_sym_count
  4216.         + undefined_global_sym_count + global_indirect_count)
  4217.       fatal ("internal error");
  4218.   
  4219.     /* Write out the relocations of all files, remembered from copy_text.  */
  4220.   
  4221. !   each_full_file (coptxtrel);
  4222.   
  4223.     if (trace_files)
  4224.       fprintf (stderr, "\nWriting data relocation:\n\n");
  4225.   
  4226. !   each_full_file (copdatrel);
  4227.   
  4228.     if (trace_files)
  4229.       fprintf (stderr, "\n");
  4230. ***************
  4231. *** 5014,5023 ****
  4232.        struct file_entry *entry;
  4233.   {
  4234.     register struct relocation_info *p, *end;
  4235. !   register int reloc = entry->text_start_address - text_start;
  4236.   
  4237.     p = entry->textrel;
  4238. !   end = (struct relocation_info *) (entry->text_reloc_size + (char *) p);
  4239.     while (p < end)
  4240.       {
  4241.         RELOC_ADDRESS(p) += reloc;
  4242. --- 3853,3862 ----
  4243.        struct file_entry *entry;
  4244.   {
  4245.     register struct relocation_info *p, *end;
  4246. !   register int reloc = entry->text_start_address;
  4247.   
  4248.     p = entry->textrel;
  4249. !   end = (struct relocation_info *) (entry->header.a_trsize + (char *) p);
  4250.     while (p < end)
  4251.       {
  4252.         RELOC_ADDRESS(p) += reloc;
  4253. ***************
  4254. *** 5029,5035 ****
  4255.                     (((char *)entry->symbols) + symindex))
  4256.                    ->n_un.n_name));
  4257.   
  4258. !       if (symindex >= entry->syms_size)
  4259.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4260.   
  4261.   #ifdef N_INDR
  4262. --- 3868,3874 ----
  4263.                     (((char *)entry->symbols) + symindex))
  4264.                    ->n_un.n_name));
  4265.   
  4266. !       if (symindex >= entry->header.a_syms)
  4267.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4268.   
  4269.   #ifdef N_INDR
  4270. ***************
  4271. *** 5044,5050 ****
  4272.         if (symptr->defined)
  4273.           {
  4274.             RELOC_EXTERN_P(p) = 0;
  4275. !           RELOC_SYMBOL(p) = (symptr->defined & ~N_EXT);
  4276.   #ifdef RELOC_ADD_EXTRA
  4277.             /* If we aren't going to be adding in the value in
  4278.                memory on the next pass of the loader, then we need
  4279. --- 3883,3889 ----
  4280.         if (symptr->defined)
  4281.           {
  4282.             RELOC_EXTERN_P(p) = 0;
  4283. !           RELOC_SYMBOL(p) = (symptr->defined & N_TYPE);
  4284.   #ifdef RELOC_ADD_EXTRA
  4285.             /* If we aren't going to be adding in the value in
  4286.                memory on the next pass of the loader, then we need
  4287. ***************
  4288. *** 5057,5083 ****
  4289.         else
  4290.           /* Debugger symbols come first, so have to start this
  4291.              after them.  */
  4292. - #ifndef NeXT
  4293.             RELOC_SYMBOL(p) = (symptr->def_count + nsyms
  4294.                    - defined_global_sym_count
  4295.                    - undefined_global_sym_count
  4296.                    - global_indirect_count);
  4297. - #else
  4298. -           RELOC_SYMBOL(p) = (symptr->def_count + nsyms
  4299. -                  - defined_global_sym_count
  4300. -                  - undefined_global_sym_count);
  4301. - #endif
  4302.       }
  4303.         p++;
  4304.       }
  4305. ! #ifdef MACH_O
  4306. !   if (output_file_type == IS_MACH_O)
  4307. !     generate_mach_o_relocations(entry->textrel,
  4308. !                 entry->text_reloc_size / sizeof (struct relocation_info));
  4309. ! #endif
  4310. !   mywrite (entry->textrel, 1, entry->text_reloc_size, outdesc);
  4311.   }
  4312.   
  4313.   void
  4314. --- 3896,3909 ----
  4315.         else
  4316.           /* Debugger symbols come first, so have to start this
  4317.              after them.  */
  4318.             RELOC_SYMBOL(p) = (symptr->def_count + nsyms
  4319.                    - defined_global_sym_count
  4320.                    - undefined_global_sym_count
  4321.                    - global_indirect_count);
  4322.       }
  4323.         p++;
  4324.       }
  4325. !   mywrite (entry->textrel, 1, entry->header.a_trsize, outdesc);
  4326.   }
  4327.   
  4328.   void
  4329. ***************
  4330. *** 5087,5100 ****
  4331.     register struct relocation_info *p, *end;
  4332.     /* Relocate the address of the relocation.
  4333.        Old address is relative to start of the input file's data section.
  4334. !      New address is relative to start of the output file's data section.
  4335.   
  4336. -      So the amount we need to relocate it by is the offset of this
  4337. -      input file's data section within the output file's data section.  */
  4338. -   register int reloc = entry->data_start_address - data_start;
  4339.     p = entry->datarel;
  4340. !   end = (struct relocation_info *) (entry->data_reloc_size + (char *) p);
  4341.     while (p < end)
  4342.       {
  4343.         RELOC_ADDRESS(p) += reloc;
  4344. --- 3913,3923 ----
  4345.     register struct relocation_info *p, *end;
  4346.     /* Relocate the address of the relocation.
  4347.        Old address is relative to start of the input file's data section.
  4348. !      New address is relative to start of the output file's data section.  */
  4349. !   register int reloc = entry->data_start_address - text_size;
  4350.   
  4351.     p = entry->datarel;
  4352. !   end = (struct relocation_info *) (entry->header.a_drsize + (char *) p);
  4353.     while (p < end)
  4354.       {
  4355.         RELOC_ADDRESS(p) += reloc;
  4356. ***************
  4357. *** 5107,5113 ****
  4358.                    ->n_un.n_name));
  4359.         int symtype;
  4360.   
  4361. !       if (symindex >= entry->syms_size)
  4362.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4363.   
  4364.   #ifdef N_INDR
  4365. --- 3930,3936 ----
  4366.                    ->n_un.n_name));
  4367.         int symtype;
  4368.   
  4369. !       if (symindex >= entry->header.a_syms)
  4370.           fatal_with_file ("relocation symbolnum out of range in ", entry);
  4371.   
  4372.   #ifdef N_INDR
  4373. ***************
  4374. *** 5116,5122 ****
  4375.           symptr = (symbol *) symptr->value;
  4376.   #endif
  4377.   
  4378. !       symtype = symptr->defined & ~N_EXT;
  4379.   
  4380.         if (force_common_definition
  4381.             || symtype == N_DATA || symtype == N_TEXT || symtype == N_ABS)
  4382. --- 3939,3945 ----
  4383.           symptr = (symbol *) symptr->value;
  4384.   #endif
  4385.   
  4386. !        symtype = symptr->defined & N_TYPE;
  4387.   
  4388.         if (force_common_definition
  4389.             || symtype == N_DATA || symtype == N_TEXT || symtype == N_ABS)
  4390. ***************
  4391. *** 5127,5133 ****
  4392.         else
  4393.           /* Debugger symbols come first, so have to start this
  4394.              after them.  */
  4395. - #ifndef NeXT
  4396.           RELOC_SYMBOL(p)
  4397.             = (((symbol *)
  4398.             (((struct nlist *)
  4399. --- 3950,3955 ----
  4400. ***************
  4401. *** 5137,5167 ****
  4402.            + nsyms - defined_global_sym_count
  4403.            - undefined_global_sym_count
  4404.            - global_indirect_count);
  4405. - #else
  4406. -         RELOC_SYMBOL(p)
  4407. -           = (((symbol *)
  4408. -           (((struct nlist *)
  4409. -             (((char *)entry->symbols) + symindex))
  4410. -            ->n_un.n_name))
  4411. -          ->def_count
  4412. -          + nsyms - defined_global_sym_count
  4413. -          - undefined_global_sym_count);
  4414. - #endif
  4415.       }
  4416.         p++;
  4417.       }
  4418. ! #ifdef MACH_O
  4419. !   if (output_file_type == IS_MACH_O)
  4420. !     generate_mach_o_relocations(entry->datarel,
  4421. !                 entry->data_reloc_size / sizeof (struct relocation_info));
  4422. ! #endif
  4423. !   mywrite (entry->datarel, 1, entry->data_reloc_size, outdesc);
  4424.   }
  4425.   
  4426.   void write_file_syms ();
  4427.   void write_string_table ();
  4428.   
  4429.   /* Total size of string table strings allocated so far,
  4430.      including strings in `strtab_vector'.  */
  4431.   int strtab_size;
  4432. --- 3959,3985 ----
  4433.            + nsyms - defined_global_sym_count
  4434.            - undefined_global_sym_count
  4435.            - global_indirect_count);
  4436.       }
  4437.         p++;
  4438.       }
  4439. !   mywrite (entry->datarel, 1, entry->header.a_drsize, outdesc);
  4440.   }
  4441.   
  4442.   void write_file_syms ();
  4443.   void write_string_table ();
  4444.   
  4445. + /* Offsets and current lengths of symbol and string tables in output file. */
  4446. + int symbol_table_offset;
  4447. + int symbol_table_len;
  4448. + /* Address in output file where string table starts.  */
  4449. + int string_table_offset;
  4450. + /* Offset within string table
  4451. +    where the strings in `strtab_vector' should be written.  */
  4452. + int string_table_len;
  4453.   /* Total size of string table strings allocated so far,
  4454.      including strings in `strtab_vector'.  */
  4455.   int strtab_size;
  4456. ***************
  4457. *** 5204,5210 ****
  4458.   {
  4459.     register int i;
  4460.   
  4461. !   lseek (outdesc, output_strs_offset + output_strs_size, 0);
  4462.   
  4463.     if (!outstream)
  4464.       outstream = fdopen (outdesc, "w");
  4465. --- 4022,4028 ----
  4466.   {
  4467.     register int i;
  4468.   
  4469. !   lseek (outdesc, string_table_offset + string_table_len, 0);
  4470.   
  4471.     if (!outstream)
  4472.       outstream = fdopen (outdesc, "w");
  4473. ***************
  4474. *** 5212,5218 ****
  4475.     for (i = 0; i < strtab_index; i++)
  4476.       {
  4477.         fwrite (strtab_vector[i], 1, strtab_lens[i], outstream);
  4478. !       output_strs_size += strtab_lens[i];
  4479.       }
  4480.   
  4481.     fflush (outstream);
  4482. --- 4030,4036 ----
  4483.     for (i = 0; i < strtab_index; i++)
  4484.       {
  4485.         fwrite (strtab_vector[i], 1, strtab_lens[i], outstream);
  4486. !       string_table_len += strtab_lens[i];
  4487.       }
  4488.   
  4489.     fflush (outstream);
  4490. ***************
  4491. *** 5236,5251 ****
  4492.        extra struct for each indirect symbol to hold the extra reference
  4493.        following. */
  4494.     struct nlist *buf
  4495. - #ifndef NeXT
  4496.       = (struct nlist *) alloca ((defined_global_sym_count
  4497.                   + undefined_global_sym_count
  4498.                   + global_indirect_count)
  4499.                      * sizeof (struct nlist));
  4500. - #else
  4501. -     = (struct nlist *) alloca ((defined_global_sym_count
  4502. -                 + undefined_global_sym_count)
  4503. -                    * sizeof (struct nlist));
  4504. - #endif
  4505.     /* Pointer for storing into BUF.  */
  4506.     register struct nlist *bufp = buf;
  4507.   
  4508. --- 4054,4063 ----
  4509. ***************
  4510. *** 5252,5259 ****
  4511.     /* Size of string table includes the bytes that store the size.  */
  4512.     strtab_size = sizeof strtab_size;
  4513.   
  4514. !   output_syms_size = 0;
  4515. !   output_strs_size = strtab_size;
  4516.   
  4517.     if (strip_symbols == STRIP_ALL)
  4518.       return;
  4519. --- 4064,4073 ----
  4520.     /* Size of string table includes the bytes that store the size.  */
  4521.     strtab_size = sizeof strtab_size;
  4522.   
  4523. !   symbol_table_offset = N_SYMOFF (outheader);
  4524. !   symbol_table_len = 0;
  4525. !   string_table_offset = N_STROFF (outheader);
  4526. !   string_table_len = strtab_size;
  4527.   
  4528.     if (strip_symbols == STRIP_ALL)
  4529.       return;
  4530. ***************
  4531. *** 5282,5292 ****
  4532.         {
  4533.       struct nlist nl;
  4534.   
  4535. - #ifdef N_SECT
  4536. -     nl.n_sect = 0;
  4537. - #else
  4538.       nl.n_other = 0;
  4539. - #endif
  4540.       nl.n_desc = 0;
  4541.   
  4542.       /* Compute a `struct nlist' for the symbol.  */
  4543. --- 4096,4102 ----
  4544. ***************
  4545. *** 5301,5308 ****
  4546.           /* If the target of an indirect symbol has been
  4547.              defined and we are outputting an executable,
  4548.              resolve the indirection; it's no longer needed */
  4549. !         if (output_style != OUTPUT_RELOCATABLE
  4550. !             && ((sp->defined & ~N_EXT) == N_INDR)
  4551.               && (((symbol *) sp->value)->defined > 1))
  4552.             {
  4553.               symbol *newsp = (symbol *) sp->value;
  4554. --- 4111,4118 ----
  4555.           /* If the target of an indirect symbol has been
  4556.              defined and we are outputting an executable,
  4557.              resolve the indirection; it's no longer needed */
  4558. !         if (!relocatable_output
  4559. !             && ((sp->defined & N_TYPE) == N_INDR)
  4560.               && (((symbol *) sp->value)->defined > 1))
  4561.             {
  4562.               symbol *newsp = (symbol *) sp->value;
  4563. ***************
  4564. *** 5342,5389 ****
  4565.           *bufp++ = nl;
  4566.           syms_written++;
  4567.           if (nl.n_type == (N_INDR | N_EXT))
  4568. - #ifndef NeXT
  4569.             {
  4570.           struct nlist xtra_ref;
  4571.           xtra_ref.n_type == N_EXT | N_UNDF;
  4572.           xtra_ref.n_un.n_strx
  4573.             = assign_string_table_index (((symbol *) sp->value)->name);
  4574. - #ifdef N_SECT
  4575. -         xtra_ref.n_sect = 0;
  4576. - #else
  4577.           xtra_ref.n_other = 0;
  4578. - #endif
  4579.           xtra_ref.n_desc = 0;
  4580.           xtra_ref.n_value = 0;
  4581.           *bufp++ = xtra_ref;
  4582.           syms_written++;
  4583.             }
  4584. - #else
  4585. -         nl.n_value = assign_string_table_index (((symbol *) sp->value)->name);
  4586. - #endif
  4587.         }
  4588.         }
  4589.   
  4590. - #ifdef MACH_O
  4591. -   if (output_file_type == IS_MACH_O)
  4592. -     generate_mach_o_symbols(buf, bufp - buf);
  4593. - #endif
  4594.     /* Output the buffer full of `struct nlist's.  */
  4595.   
  4596. !   lseek (outdesc, output_syms_offset + output_syms_size, 0);
  4597.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4598. !   output_syms_size += sizeof (struct nlist) * (bufp - buf);
  4599.   
  4600.     if (syms_written != nsyms)
  4601.       fatal ("internal error: wrong number of symbols written into output file", 0);
  4602.   
  4603. !   /* Now the total string table size is known, so write it into the
  4604. !      first word of the string table.  */
  4605.   
  4606. !   lseek (outdesc, output_strs_offset, 0);
  4607. !   mywrite (&strtab_size, sizeof (int), 1, outdesc);
  4608.   
  4609.     /* Write the strings for the global symbols.  */
  4610.   
  4611.     write_string_table ();
  4612. --- 4152,4188 ----
  4613.           *bufp++ = nl;
  4614.           syms_written++;
  4615.           if (nl.n_type == (N_INDR | N_EXT))
  4616.             {
  4617.           struct nlist xtra_ref;
  4618.           xtra_ref.n_type == N_EXT | N_UNDF;
  4619.           xtra_ref.n_un.n_strx
  4620.             = assign_string_table_index (((symbol *) sp->value)->name);
  4621.           xtra_ref.n_other = 0;
  4622.           xtra_ref.n_desc = 0;
  4623.           xtra_ref.n_value = 0;
  4624.           *bufp++ = xtra_ref;
  4625.           syms_written++;
  4626.             }
  4627.         }
  4628.         }
  4629.   
  4630.     /* Output the buffer full of `struct nlist's.  */
  4631.   
  4632. !   lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  4633.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4634. !   symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  4635.   
  4636.     if (syms_written != nsyms)
  4637.       fatal ("internal error: wrong number of symbols written into output file", 0);
  4638.   
  4639. !   if (symbol_table_offset + symbol_table_len != string_table_offset)
  4640. !     fatal ("internal error: inconsistent symbol table length", 0);
  4641.   
  4642. !   /* Now the total string table size is known, so write it.
  4643. !      We are already positioned at the right place in the file.  */
  4644.   
  4645. +   mywrite (&strtab_size, sizeof (int), 1, outdesc);  /* we're at right place */
  4646.     /* Write the strings for the global symbols.  */
  4647.   
  4648.     write_string_table ();
  4649. ***************
  4650. *** 5401,5416 ****
  4651.        int *syms_written_addr;
  4652.   {
  4653.     register struct nlist *p = entry->symbols;
  4654. !   register struct nlist *end = p + entry->syms_size / sizeof (struct nlist);
  4655.   
  4656.     /* Buffer to accumulate all the syms before writing them.
  4657.        It has one extra slot for the local symbol we generate here.  */
  4658.     struct nlist *buf
  4659. !     = (struct nlist *) alloca (entry->syms_size + sizeof (struct nlist));
  4660.     register struct nlist *bufp = buf;
  4661.   
  4662.     /* Upper bound on number of syms to be written here.  */
  4663. !   int max_syms = (entry->syms_size / sizeof (struct nlist)) + 1;
  4664.   
  4665.     /* Make tables that record, for each symbol, its name and its name's length.
  4666.        The elements are filled in by `assign_string_table_index'.  */
  4667. --- 4200,4215 ----
  4668.        int *syms_written_addr;
  4669.   {
  4670.     register struct nlist *p = entry->symbols;
  4671. !   register struct nlist *end = p + entry->header.a_syms / sizeof (struct nlist);
  4672.   
  4673.     /* Buffer to accumulate all the syms before writing them.
  4674.        It has one extra slot for the local symbol we generate here.  */
  4675.     struct nlist *buf
  4676. !     = (struct nlist *) alloca (entry->header.a_syms + sizeof (struct nlist));
  4677.     register struct nlist *bufp = buf;
  4678.   
  4679.     /* Upper bound on number of syms to be written here.  */
  4680. !   int max_syms = (entry->header.a_syms / sizeof (struct nlist)) + 1;
  4681.   
  4682.     /* Make tables that record, for each symbol, its name and its name's length.
  4683.        The elements are filled in by `assign_string_table_index'.  */
  4684. ***************
  4685. *** 5429,5439 ****
  4686.         nl.n_un.n_strx = assign_string_table_index (entry->local_sym_name);
  4687.         nl.n_value = entry->text_start_address;
  4688.         nl.n_desc = 0;
  4689. - #ifdef N_SECT
  4690. -       nl.n_sect = 0;
  4691. - #else
  4692.         nl.n_other = 0;
  4693. - #endif
  4694.         *bufp++ = nl;
  4695.         (*syms_written_addr)++;
  4696.         entry->local_syms_offset = *syms_written_addr * sizeof (struct nlist);
  4697. --- 4228,4234 ----
  4698. ***************
  4699. *** 5441,5447 ****
  4700.   
  4701.     /* Read the file's string table.  */
  4702.   
  4703. !   entry->strings = (char *) alloca (entry->strs_size);
  4704.     read_entry_strings (file_open (entry), entry);
  4705.   
  4706.     for (; p < end; p++)
  4707. --- 4236,4242 ----
  4708.   
  4709.     /* Read the file's string table.  */
  4710.   
  4711. !   entry->strings = (char *) alloca (entry->string_size);
  4712.     read_entry_strings (file_open (entry), entry);
  4713.   
  4714.     for (; p < end; p++)
  4715. ***************
  4716. *** 5456,5462 ****
  4717.                   /* types of symbols are never written */
  4718.                   /* globally, though they are stored */
  4719.                   /* globally.  */
  4720. !         write = output_style == OUTPUT_RELOCATABLE;
  4721.         else if (!(type & (N_STAB | N_EXT)))
  4722.           /* ordinary local symbol */
  4723.       write = ((discard_locals != DISCARD_ALL)
  4724. --- 4251,4257 ----
  4725.                   /* types of symbols are never written */
  4726.                   /* globally, though they are stored */
  4727.                   /* globally.  */
  4728. !         write = relocatable_output;
  4729.         else if (!(type & (N_STAB | N_EXT)))
  4730.           /* ordinary local symbol */
  4731.       write = ((discard_locals != DISCARD_ALL)
  4732. ***************
  4733. *** 5483,5498 ****
  4734.       }
  4735.       }
  4736.   
  4737. - #ifdef MACH_O
  4738. -   if (output_file_type == IS_MACH_O)
  4739. -     generate_mach_o_symbols(buf, bufp - buf);
  4740. - #endif
  4741.     /* All the symbols are now in BUF; write them.  */
  4742.   
  4743. !   lseek (outdesc, output_syms_offset + output_syms_size, 0);
  4744.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4745. !   output_syms_size += sizeof (struct nlist) * (bufp - buf);
  4746.   
  4747.     /* Write the string-table data for the symbols just written,
  4748.        using the data in vectors `strtab_vector' and `strtab_lens'.  */
  4749. --- 4278,4288 ----
  4750.       }
  4751.       }
  4752.   
  4753.     /* All the symbols are now in BUF; write them.  */
  4754.   
  4755. !   lseek (outdesc, symbol_table_offset + symbol_table_len, 0);
  4756.     mywrite (buf, sizeof (struct nlist), bufp - buf, outdesc);
  4757. !   symbol_table_len += sizeof (struct nlist) * (bufp - buf);
  4758.   
  4759.     /* Write the string-table data for the symbols just written,
  4760.        using the data in vectors `strtab_vector' and `strtab_lens'.  */
  4761. ***************
  4762. *** 5510,5516 ****
  4763.   void
  4764.   write_symsegs ()
  4765.   {
  4766. -   lseek (outdesc, output_symseg_offset, 0);
  4767.     each_file (write_file_symseg, 0);
  4768.   }
  4769.   
  4770. --- 4300,4305 ----
  4771. ***************
  4772. *** 5520,5532 ****
  4773.   {
  4774.     char buffer[4096];
  4775.     struct symbol_root root;
  4776. !   int indesc, len, total;
  4777.   
  4778. !   if (entry->symseg_size == 0)
  4779.       return;
  4780.   
  4781. -   output_symseg_size += entry->symseg_size;
  4782.     /* This entry has a symbol segment.  Read the root of the segment.  */
  4783.   
  4784.     indesc = file_open (entry);
  4785. --- 4309,4320 ----
  4786.   {
  4787.     char buffer[4096];
  4788.     struct symbol_root root;
  4789. !   int indesc;
  4790. !   int len;
  4791.   
  4792. !   if (entry->symseg_offset == 0)
  4793.       return;
  4794.   
  4795.     /* This entry has a symbol segment.  Read the root of the segment.  */
  4796.   
  4797.     indesc = file_open (entry);
  4798. ***************
  4799. *** 5537,5545 ****
  4800.     /* Store some relocation info into the root.  */
  4801.   
  4802.     root.ldsymoff = entry->local_syms_offset;
  4803. !   root.textrel = entry->text_start_address - entry->orig_text_address;
  4804. !   root.datarel = entry->data_start_address - entry->orig_data_address;
  4805. !   root.bssrel = entry->bss_start_address - entry->orig_bss_address;
  4806.     root.databeg = entry->data_start_address - root.datarel;
  4807.     root.bssbeg = entry->bss_start_address - root.bssrel;
  4808.   
  4809. --- 4325,4334 ----
  4810.     /* Store some relocation info into the root.  */
  4811.   
  4812.     root.ldsymoff = entry->local_syms_offset;
  4813. !   root.textrel = entry->text_start_address;
  4814. !   root.datarel = entry->data_start_address - entry->header.a_text;
  4815. !   root.bssrel = entry->bss_start_address
  4816. !     - entry->header.a_text - entry->header.a_data;
  4817.     root.databeg = entry->data_start_address - root.datarel;
  4818.     root.bssbeg = entry->bss_start_address - root.bssrel;
  4819.   
  4820. ***************
  4821. *** 5549,5646 ****
  4822.   
  4823.     /* Copy the rest of the symbol segment unchanged.  */
  4824.   
  4825. !   total = entry->symseg_size - sizeof root;
  4826. !   while (total > 0)
  4827.       {
  4828. !       len = read (indesc, buffer, min (sizeof buffer, total));
  4829. !       if (len != min (sizeof buffer, total))
  4830. !     fatal_with_file ("premature end of file in symbol segment of ", entry);
  4831. !       total -= len;
  4832. !       mywrite (buffer, len, 1, outdesc);
  4833.       }
  4834.   
  4835.     file_close ();
  4836.   }
  4837.   
  4838. - /* Define a special symbol (etext, edata, or end).  NAME is the
  4839. -    name of the symbol, with a leading underscore (whether or not this
  4840. -    system uses such underscores).  TYPE is its type (e.g. N_DATA | N_EXT).
  4841. -    Store a symbol * for the symbol in *SYM if SYM is non-NULL.  */
  4842. - static void
  4843. - symbol_define (name, type, sym)
  4844. -      /* const */ char *name;
  4845. -      int type;
  4846. -      symbol **sym;
  4847. - {
  4848. -   symbol *thesym;
  4849. - #if defined(nounderscore)
  4850. -   /* Skip the leading underscore.  */
  4851. -   name++;
  4852. - #endif
  4853. -   thesym = getsym (name);
  4854. -   if (thesym->defined)
  4855. -     {
  4856. -       /* The symbol is defined in some input file.  Don't mess with it.  */
  4857. -       if (sym)
  4858. -     *sym = 0;
  4859. -     }
  4860. -   else
  4861. -     {
  4862. -       if (thesym->referenced)
  4863. -     /* The symbol was not defined, and we are defining it now.  */
  4864. -     undefined_global_sym_count--;
  4865. -       thesym->defined = type;
  4866. -       thesym->referenced = 1;
  4867. -       if (sym)
  4868. -     *sym = thesym;
  4869. -     }
  4870. - }
  4871.   /* Create the symbol table entries for `etext', `edata' and `end'.  */
  4872.   
  4873.   void
  4874.   symtab_init ()
  4875.   {
  4876. !   symbol_define ("_edata", N_DATA | N_EXT, &edata_symbol);
  4877. !   symbol_define ("_etext", N_TEXT | N_EXT, &etext_symbol);
  4878. !   symbol_define ("_end", N_BSS | N_EXT, &end_symbol);
  4879. !   /* Either _edata or __edata (C names) is OK as far as ANSI is concerned
  4880. !      (see section 4.1.2.1).  In general, it is best to use __foo and
  4881. !      not worry about the confusing rules for the _foo namespace.
  4882. !      But HPUX 7.0 uses _edata, so we might as weel be consistent.  */
  4883. !   symbol_define ("__edata", N_DATA | N_EXT, &edata_symbol_alt);
  4884. !   symbol_define ("__etext", N_TEXT | N_EXT, &etext_symbol_alt);
  4885. !   symbol_define ("__end", N_BSS | N_EXT, &end_symbol_alt);
  4886.   
  4887.   #ifdef sun
  4888.     {
  4889. !     symbol *dynamic_symbol;
  4890. !     symbol_define ("__DYNAMIC", N_ABS | N_EXT, &dynamic_symbol);
  4891. !     if (dynamic_symbol)
  4892. !       dynamic_symbol->value = 0;
  4893. !   }
  4894. ! #endif
  4895. ! #ifdef sequent
  4896. !   {
  4897. !     symbol *i387_flt_symbol;
  4898. !     symbol_define ("_387_flt", N_ABS | N_EXT, &i387_flt_symbol);
  4899. !     if (i387_flt_symbol)
  4900. !       i387_flt_symbol->value = 0;
  4901. !   }
  4902. ! #endif
  4903. ! #ifdef NeXT
  4904. !   {
  4905. !     symbol *shlib_init_symbol;
  4906. !     symbol_define ("__shared_library_initialization", N_UNDF | N_EXT, &shlib_init_symbol);
  4907. !     if (shlib_init_symbol)
  4908. !       shlib_init_symbol->max_common_size = sizeof (long int);
  4909.     }
  4910. ! #endif
  4911.   }
  4912.   
  4913.   /* Compute the hash code for symbol name KEY.  */
  4914. --- 4338,4414 ----
  4915.   
  4916.     /* Copy the rest of the symbol segment unchanged.  */
  4917.   
  4918. !   if (entry->superfile)
  4919.       {
  4920. !       /* Library member: number of bytes to copy is determined
  4921. !      from the member's total size.  */
  4922. !       int total = entry->total_size - entry->symseg_offset - sizeof root;
  4923. !       while (total > 0)
  4924. !     {
  4925. !       len = read (indesc, buffer, min (sizeof buffer, total));
  4926. !       if (len != min (sizeof buffer, total))
  4927. !         fatal_with_file ("premature end of file in symbol segment of ", entry);
  4928. !       total -= len;
  4929. !       mywrite (buffer, len, 1, outdesc);
  4930. !     }
  4931. !     }
  4932. !   else
  4933. !     {
  4934. !       /* A separate file: copy until end of file.  */
  4935. !       while (len = read (indesc, buffer, sizeof buffer))
  4936. !     {
  4937. !       mywrite (buffer, len, 1, outdesc);
  4938. !       if (len < sizeof buffer)
  4939. !         break;
  4940. !     }
  4941.       }
  4942.   
  4943.     file_close ();
  4944.   }
  4945.   
  4946.   /* Create the symbol table entries for `etext', `edata' and `end'.  */
  4947.   
  4948.   void
  4949.   symtab_init ()
  4950.   {
  4951. ! #ifndef nounderscore
  4952. !   edata_symbol = getsym ("_edata");
  4953. !   etext_symbol = getsym ("_etext");
  4954. !   end_symbol = getsym ("_end");
  4955. ! #else
  4956. !   edata_symbol = getsym ("edata");
  4957. !   etext_symbol = getsym ("etext");
  4958. !   end_symbol = getsym ("end");
  4959. ! #endif
  4960.   
  4961.   #ifdef sun
  4962.     {
  4963. !     symbol *dynamic_symbol = getsym ("__DYNAMIC");
  4964. !     dynamic_symbol->defined = N_ABS | N_EXT;
  4965. !     dynamic_symbol->referenced = 1;
  4966. !     dynamic_symbol->value = 0;
  4967.     }
  4968. ! #endif
  4969. ! #ifdef sequent
  4970. !   {
  4971. !     symbol *_387_flt_symbol = getsym ("_387_flt");
  4972. !     _387_flt_symbol->defined = N_ABS | N_EXT;
  4973. !     _387_flt_symbol->referenced = 1;
  4974. !     _387_flt_symbol->value = 0;
  4975. !   }
  4976. ! #endif
  4977. !   edata_symbol->defined = N_DATA | N_EXT;
  4978. !   etext_symbol->defined = N_TEXT | N_EXT;
  4979. !   end_symbol->defined = N_BSS | N_EXT;
  4980. !   edata_symbol->referenced = 1;
  4981. !   etext_symbol->referenced = 1;
  4982. !   end_symbol->referenced = 1;
  4983.   }
  4984.   
  4985.   /* Compute the hash code for symbol name KEY.  */
  4986. ***************
  4987. *** 5727,5754 ****
  4988.     return 0;
  4989.   }
  4990.   
  4991. - /* Report a usage error.
  4992. -    Like fatal except prints a usage summary.  */
  4993. - void
  4994. - usage (string, arg)
  4995. -      char *string, *arg;
  4996. - {
  4997. -   if (string)
  4998. -     {
  4999. -       fprintf (stderr, "%s: ", progname);
  5000. -       fprintf (stderr, string, arg);
  5001. -       fprintf (stderr, "\n");
  5002. -     }
  5003. -   fprintf (stderr, "\
  5004. - Usage: %s [-d] [-dc] [-dp] [-e symbol] [-l lib] [-n] [-noinhibit-exec]\n\
  5005. -        [-nostdlib] [-o file] [-r] [-s] [-t] [-u symbol] [-x] [-y symbol]\n\
  5006. -        [-z] [-A file] [-Bstatic] [-D size] [-L libdir] [-M] [-N]\n\
  5007. -        [-S] [-T[{text,data}] addr] [-V prefix] [-X] [file...]\n",
  5008. -        progname);
  5009. -   exit (1);
  5010. - }
  5011.   /* Report a fatal error.
  5012.      STRING is a printf format string and ARG is one arg for it.  */
  5013.   
  5014. --- 4495,4500 ----
  5015. ***************
  5016. *** 5756,5762 ****
  5017.   fatal (string, arg)
  5018.        char *string, *arg;
  5019.   {
  5020. !   fprintf (stderr, "%s: ", progname);
  5021.     fprintf (stderr, string, arg);
  5022.     fprintf (stderr, "\n");
  5023.     exit (1);
  5024. --- 4502,4508 ----
  5025.   fatal (string, arg)
  5026.        char *string, *arg;
  5027.   {
  5028. !   fprintf (stderr, "ld: ");
  5029.     fprintf (stderr, string, arg);
  5030.     fprintf (stderr, "\n");
  5031.     exit (1);
  5032. ***************
  5033. *** 5770,5776 ****
  5034.        char *string;
  5035.        struct file_entry *entry;
  5036.   {
  5037. !   fprintf (stderr, "%s: ", progname);
  5038.     fprintf (stderr, string);
  5039.     print_file_name (entry, stderr);
  5040.     fprintf (stderr, "\n");
  5041. --- 4516,4522 ----
  5042.        char *string;
  5043.        struct file_entry *entry;
  5044.   {
  5045. !   fprintf (stderr, "ld: ");
  5046.     fprintf (stderr, string);
  5047.     print_file_name (entry, stderr);
  5048.     fprintf (stderr, "\n");
  5049. ***************
  5050. *** 5900,5910 ****
  5051.   
  5052.   /* Like malloc but get fatal error if memory is exhausted.  */
  5053.   
  5054. ! char *
  5055.   xmalloc (size)
  5056.        int size;
  5057.   {
  5058. !   register char *result = malloc (size);
  5059.     if (!result)
  5060.       fatal ("virtual memory exhausted", 0);
  5061.     return result;
  5062. --- 4646,4656 ----
  5063.   
  5064.   /* Like malloc but get fatal error if memory is exhausted.  */
  5065.   
  5066. ! int
  5067.   xmalloc (size)
  5068.        int size;
  5069.   {
  5070. !   register int result = malloc (size);
  5071.     if (!result)
  5072.       fatal ("virtual memory exhausted", 0);
  5073.     return result;
  5074. ***************
  5075. *** 5912,5923 ****
  5076.   
  5077.   /* Like realloc but get fatal error if memory is exhausted.  */
  5078.   
  5079. ! char *
  5080.   xrealloc (ptr, size)
  5081.        char *ptr;
  5082.        int size;
  5083.   {
  5084. !   register char *result = realloc (ptr, size);
  5085.     if (!result)
  5086.       fatal ("virtual memory exhausted", 0);
  5087.     return result;
  5088. --- 4658,4669 ----
  5089.   
  5090.   /* Like realloc but get fatal error if memory is exhausted.  */
  5091.   
  5092. ! int
  5093.   xrealloc (ptr, size)
  5094.        char *ptr;
  5095.        int size;
  5096.   {
  5097. !   register int result = realloc (ptr, size);
  5098.     if (!result)
  5099.       fatal ("virtual memory exhausted", 0);
  5100.     return result;
  5101. ***************
  5102. *** 5944,5955 ****
  5103.     return (4096);
  5104.   }
  5105.   
  5106. - #endif
  5107. - #if defined(sun) && defined(sparc)
  5108. - int
  5109. - getpagesize ()
  5110. - {
  5111. -   return 8192;
  5112. - }
  5113.   #endif
  5114. --- 4690,4693 ----
  5115.